加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 嵌套循环的任意数量?

发布时间:2020-12-16 05:59:37 所属栏目:百科 来源:网络整理
导读:我正在寻找任意数量的列表(例如[2,1,4 …],[8,3,…],…)并从每个列表中选择数字,以便生成所有排列.例如.: [2,8,…] [2,…] [1,…] [4,…] … 这很容易使用嵌套for循环完成,但是由于我想要它接受任意数量的列表,似乎for循环必须是硬编码.每个列表一个.此外,
我正在寻找任意数量的列表(例如[2,1,4 …],[8,3,…],…)并从每个列表中选择数字,以便生成所有排列.例如.:

[2,8,…]
[2,…]
[1,…]
[4,…]

这很容易使用嵌套for循环完成,但是由于我想要它接受任意数量的列表,似乎for循环必须是硬编码.每个列表一个.此外,由于我的程序可能会产生数以万计的排列,所以我想一次生成一个排列(而不是一次计算它们,并将结果存储到一个向量中).有没有办法完成这个程序?

由于在编译时知道列表的数量,所以我想也许我可以使用基于模板的元编程.但这似乎很笨拙,也不符合“一个一个”的要求.有什么建议么?

解决方法

您可以使用计数的基本原理,例如递增最后一位数,直到达到最大值,然后增加最后一位数,等等,如倒计时
这是一个示例代码,假设可能有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的组合.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读