我正在寻找任意数量的列表(例如[2,1,4 …],[8,3,…],…)并从每个列表中选择数字,以便生成所有排列.例如.:
[2,8,…]
[2,…]
[1,…]
[4,…]
…
这很容易使用嵌套for循环完成,但是由于我想要它接受任意数量的列表,似乎for循环必须是硬编码.每个列表一个.此外,由于我的程序可能会产生数以万计的排列,所以我想一次生成一个排列(而不是一次计算它们,并将结果存储到一个向量中).有没有办法完成这个程序?
由于在编译时知道列表的数量,所以我想也许我可以使用基于模板的元编程.但这似乎很笨拙,也不符合“一个一个”的要求.有什么建议么?
解决方法
您可以使用计数的基本原理,例如递增最后一位数,直到达到最大值,然后增加最后一位数,等等,如倒计时
这是一个示例代码,假设可能有diff列表的diff长度.
这是一个示例代码,假设可能有diff列表的diff长度.
#include <iostream> using namespace std; int main() { int n; cin>>n; int a[n],len[n],i,j; for(i = 0 ; i < n ; i++) { cin>>len[i]; a[i]=0; } while(1) { for(i = 0 ; i< n;i++) cout<<a[i]<<" "; cout<<endl; for(j = n-1 ; j>=0 ; j--) { if(++a[j]<=len[j]) break; else a[j]=0; } if(j<0) break; } return 0; }
尝试用4 1 1 1 1运行代码,它将给出0和1的所有4位排列.
0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1
您可以使用2d数组来获取nos的组合.