通过移动行生成所有可能的2D阵列组合

时间:2012-11-03 04:36:38

标签: permutation combinations

我们有一个尺寸为NxN的2D数组。我们选择任意一行并向左或向右移动。就像一行是“3 4 5 6”一样,我们可以将它向右移动1个单位以获得“6 3 4 5”。因此,我必须使用如上所示的行移位从给定数组中打印所有可能的2D数组。

这是一个非常棘手的组合,我尝试迭代但它对我来说太复杂了所以我认为如果我们递归地解决这个问题应该会更容易,但我无论如何都无法完成这个问题。我在班次方面没有问题但是在生成所有可能的组合时遇到了问题。

This是我发现的相关但不适用于我自己的问题。

1 个答案:

答案 0 :(得分:1)

这似乎是你可以用嵌套的for循环做的事情。假设你有一个函数可以在你的2D数组中移动一行名为rowShift(rowNum,rowOffset,& theArray)......

int i1,i2,i3,i4;
for(i4=0; i4 <= 3; ++i4) {
    for(i3=0; i3 <= 3; ++i3) {
        for(i2=0; i2 <= 3; ++i2) {
            for(i1=0; i1 <= 3; ++i1) {
                rowShift(0, i1, theArray);
            }
            rowShift(1, i2, theArray);
        }
        rowShift(2, i3, theArray);
    }
    rowShift(3, i4, theArray);
}

如果你想保存每个组合,你需要在循环中的每个rowShift调用之后使用某种saveState()函数。

我想你也可以做一个递归函数。

我很好奇这是用来做什么的 - 如果你不介意分享。似乎是一个有趣的问题。 :)