2

我们有一个大小为 NxN 的 2D 数组。我们选择任何行并将其向左或向右移动。就像如果一行是 "3 4 5 6" 我们可以将其向右移动 1 个单位以获得 "6 3 4 5" 。所以我必须使用如上所示的行移位从给定数组中打印所有可能的二维数组。

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

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

4

1 回答 1

1

这似乎是您可以使用嵌套 for 循环执行的操作。假设您有一个可以移动二维数组中的一行的函数,称为 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() 函数。

我想您也可以将其作为递归函数来执行。

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

于 2012-11-03T05:38:59.173 回答