【问题标题】:How to fill a 2D array with Every Possible Combination? C++ Logic如何用每个可能的组合填充二维数组? C++ 逻辑
【发布时间】:2014-12-10 10:24:50
【问题描述】:

我无法弄清楚这个背后的逻辑......这是我目前所拥有的:

#include <iostream>
using namespace std;

int thearray[4][4];
int NbPos = 4;

int main() {
    int i2;
    int q2;

    for(int i = 1; i < 4; i++) { 
        for(int q = 1; q < 4; q++) { 
            for(int c = 0; c < NbPos; c++) {
                thearray[i][q] = c;
            }
        }
    }
}

这是把数组填充到最后还是:

3 3 3
3 3 3
3 3 3

但它这样做并没有击中任何可能的组合。
理想情况下,一旦到达:

0 0 0
0 0 0
0 0 3

下一步应该是:

0 0 0
0 0 0
0 1 0

所以它达到了大量的组合。关于如何让它击中他们的任何想法?我被逻辑难住了!

【问题讨论】:

    标签: c++ arrays logic 2d combinations


    【解决方案1】:

    按照您对它进行迭代的方式,一维数组将使循环更简单。您仍然可以在心理上将其视为具有行和列,但是它们只是在代码中端到端布局。

    你可以试试这样的;但是,如果您特别希望它是 2D 格式,那么挑战就留给您了 ;)

    #include <iostream>
    
    using namespace std;
    
    #define rows 4
    #define columns 4
    
    int main() {
    
        int thearray[rows * columns] = {0};
        int NbPos = 4;
        int lastPos = rows * columns - 1;
    
        while (true) {
            thearray[lastPos]++;
    
            int pos = lastPos;
            while (thearray[pos] == NbPos and pos >= 1) {
                thearray[pos - 1]++;
                thearray[pos] = 0;
                pos--;
            }
    
            bool finished = true;
            for (int i = 0; i < rows * columns; i++) {
                if (thearray[i] != NbPos - 1) {
                    finished = false;
                }
            }
    
            if (finished) {
                break;
            }
        }
    
        for (int i = 0; i < rows * columns; i++) {
            std::cout << thearray[i] << " ";
            if (i % rows == rows - 1) {
                cout << endl; // makes it look like a 2D array
            }
        }
    }
    

    【讨论】:

    • 仅供运行此程序的任何人参考,我的电脑需要 100 多秒才能运行到最后,以防您认为它不起作用;)
    【解决方案2】:

    将最终形式全部设为 3s 是有意义的,因为您循环数组的每个元素并在末尾用 3 分配它。

    所以下一个元素只会考虑与前一个元素的最终值(即3)的组合。

    用数学术语思考,可以说你的复杂度是 N^3 (实际上是 N^2 * 4 ,但因为你的 N 是 3 ...)。 您的方法是错误的,因为您想找到由阶乘函数而不是多项式函数定义的排列。

    输出的必要复杂性与您的算法的复杂性不匹配(您的算法对于所需的输出量来说非常快)。

    您正在寻找的是回溯(回溯将与您的输出所需的复杂性相匹配)。

    递归函数应该是这样的(考虑一维数组,有 9 个元素):

     RecursiveGeneratePermutations(int* curArray, int curIdx)
     {
        if (curIDX==9)
        {
           for (int i=0; i<9;i++)
           {
               // write the array
           }
        } else {
           curArray[curIdx]=0;
           RecursiveGeneratePermutations(curIdx+1);
           curArray[curIdx]=1;
           RecursiveGeneratePermutations(curIdx+1);
           curArray[curIdx]=2;
           RecursiveGeneratePermutations(curIdx+1);
           curArray[curIdx]=3;
           RecursiveGeneratePermutations(curIdx+1);
        }
     }
    

    现在你只需要为索引 0 调用函数:

    RecursiveGeneratePermutations(arrayPtr,0);
    

    然后等待...分配:)。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多