2

サイズが NxN の 2D 配列があります。任意の行を選択し、左または右にシフトします。行が "3 4 5 6" の場合のように、これを 1 単位右にシフトして "6 3 4 5" を得ることができます。したがって、上記の行シフトを使用して、特定の配列から可能なすべての 2D 配列を印刷する必要があります。

非常にトリッキーな組み合わせになり、何度も試しましたが複雑になりすぎたので、この問題に再帰的に取り組むと簡単になると思いますが、とにかく問題を完了することができませんでした。シフトに問題はありませんが、可能なすべての組み合わせを生成する際に問題が発生します。

これは私が関連して見つけたものですが、私自身の問題には適用できませんでした。

4

1 に答える 1

1

これは、ネストされた for ループで実行できるように思えます。rowShift( rowNum, rowOffset, &theArray ) と呼ばれる 2D 配列内の行をシフトできる関数があると仮定します...

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 に答える