首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >若干固定数的置换

若干固定数的置换
EN

Stack Overflow用户
提问于 2011-01-19 21:07:07
回答 4查看 1.7K关注 0票数 3

如果我需要指定位置的字符/数字,如何有效地生成一个数字(或word中的字符)的排列?

例如,用数字3从开始生成所有数字,从第二位生成,从数字末尾生成第二位的数字1。每个数字中的数字必须是唯一的,您只能从数字1-5中选择。

代码语言:javascript
复制
4 3 2 1 5
4 3 5 1 2
2 3 4 1 5
2 3 5 1 4
5 3 2 1 4
5 3 4 1 2

我知道有一个next_permutation函数,所以我可以准备一个数字{4,2,5}的数组,并把它循环到这个函数中,但是如何处理固定位置呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-19 21:09:51

生成2 4 5的所有排列,并在输出例程中插入3和1。只要记住,如果他们必须这样做的话:

代码语言:javascript
复制
int perm[3] = {2, 4, 5};
const int N = sizeof(perm) / sizeof(int);

std::map<int,int> fixed;  // note: zero-indexed
fixed[1] = 3;
fixed[3] = 1;

do {
    for (int i=0, j=0; i<5; i++)
        if (fixed.find(i) != fixed.end())
            std::cout << " " << fixed[i];
        else
            std::cout << " " << perm[j++];
    std::cout << std::endl;
} while (std::next_permutation(perm, perm + N));

输出

代码语言:javascript
复制
 2 3 4 1 5
 2 3 5 1 4
 4 3 2 1 5
 4 3 5 1 2
 5 3 2 1 4
 5 3 4 1 2
票数 7
EN

Stack Overflow用户

发布于 2011-01-20 02:42:25

我读过其他的答案,我相信在你的具体问题上,它们比我的好。不过,如果有人需要一个通用的解决方案来解决你的问题,我会回答。

我最近需要生成三个独立的连续范围[first1,last1) + [first2,last2) + [first3,last3)的所有排列。这对应于您的情况,所有三个范围都是长度为1,并且只有一个元素分隔。在我的例子中,唯一的限制是距离(first3,last3) >=距离(first1,last1) +距离(first2,last2) (我相信可以用更多的计算费用来放松这个限制)。

我的应用程序是生成每个唯一的排列,而不是它的反向排列。守则如下:

http://howardhinnant.github.io/combinations.html

具体适用的函数是combine_discontinuous3 (创建组合),它在创建排列的reversible_permutation::operator()中使用。

这不是一个现成的打包解决方案,您的问题。但是它是一个工具集,可以用来解决问题的泛化。同样,对于您的简单问题,我推荐其他人已经提供的更简单的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2011-01-19 21:10:33

记住你想要固定号码的地方。从数组中删除它们。像往常一样产生排列。在每次排列之后,将固定的数字插入到它们应该出现的位置,然后输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4740760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档