Nic*_*k L 11 c++ nested metaprogramming permutation
我希望采用任意数量的列表(例如[2,1,4 ...],[8,3,...],...)并从每个列表中选择数字以生成所有排列.例如:
[2,8,...],[2,3,...],[1,8,...],[1,3,...],[4,8,...], [4,3,...],......
这可以使用嵌套的for循环轻松完成,但由于我希望它接受任意数量的列表,似乎for循环必须是硬编码的.每个列表一个.此外,由于我的程序可能会产生数万个排列,我想一次生成一个单独的排列(而不是一次性计算它们并将结果存储到向量中).有没有办法以编程方式完成此操作?
由于在编译时知道列表的数量,我想也许我可以使用基于模板的元编程.然而,这看起来很笨拙,也不符合"一次一个"的要求.有什么建议?
您可以使用计数的基本原理,例如递增最后一位数直到达到其最大值,然后递增倒数第二位,依此类推,就像倒计时一样这里是一个示例代码,假设可能存在差异列表的差异.
#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;
}
Run Code Online (Sandbox Code Playgroud)
尝试运行代码,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
Run Code Online (Sandbox Code Playgroud)
您可以使用2d数组来获取nos的组合.
STL 没有为此提供现成的函数,但是您可以通过修改next_permutation
.
该问题类似于实现二进制数字加法器。增量array[0]
。如果新的值array[0]
溢出(意味着它的值大于您拥有的列表的数量),则设置array[0]
为零并递增array[1]
。等等。