0

私と友人は、興味深いコンピューター サイエンスの質問について熟考しています。


シンプルな2D Arrayがあります:

[  1,  2,  3,  4 ]
[  5,  6,  7,  8 ]
[  9, 10, 11, 12 ]
[ 13, 14, 15, 16 ]

次に、この配列を取得して、配列内のすべての要素をシャッフルします。

[ 11,  5, 14, 10 ]
[  8,  2,  4, 16 ]
[ 15,  1,  3, 13 ]
[  6, 12,  9,  7 ]

最初はかなり単純な概念。しかし、もう一歩踏み出すとどうなるでしょうか。ここで、新しい配列の要素が、元の配列でカーディナル方向に隣接していた項目の隣にならないように、元の配列をシャッフルします。

1 は 2 の隣にあり、元の配列でも 2 の隣にあるため、最初のシャッフルは失敗します。

これが実際の例です:

[  7, 16, 13,  2 ]
[ 14,  3,  5,  8 ]
[  9,  1,  4, 11 ]
[ 12, 10, 15,  6 ]

それでも悪くない。さて、本当の質問に!

元の配列を再びシャッフルして、配列の要素が基数方向または対角線のいずれかで隣接していた要素の隣にならないようにします。

1 は斜めに 5 の隣にあり、元の配列では 5 の隣にあるため、この作業例は失敗します。

いくつかの考え:

  1. 配列を決定することさえできますか?
  2. 配列のサイズに依存しますか?
  3. 配列は対称である必要がありますか?
  4. 配列には偶数/奇数の要素が必要ですか?
  5. サイズM x Nのすべての配列に解が適用されますか?
  6. 解決策がある場合、新しいアレイを見つけるのにかかる時間はどれくらいですか?

どう思いますか?

編集

私の質問が「トピック外」として閉じられていることに驚いています。FAQによると、私の質問が「...一般的に特定のプログラミングの問題をカバーしている...」場合、それは尋ねられることが許可されており、「トピック外」ではありません。

私が求めていた最終的な質問は次のとおりです。

「2D配列を取り、それをシャッフルして、対角線を含め、新しい配列でメンバーが互いに隣り合わないようにすることはできますか」.

それは良いプログラミングの質問ではありませんか? 私の質問はクローズされるべきではないと強く感じています。

4

1 に答える 1

1
1.Can an array even be determined?
  • 確かに、変換 Rn -> RN をエッジへの転置によって使用できます。

2.配列のサイズに依存しますか?

  • MxM <= 3 ではできないので、はい。

3.アレイは対称である必要がありますか?

  • 場合によります *

配列には偶数/奇数の要素が必要ですか?

  • 場合によります *

5.サイズが M × N のすべての配列に対して解が成り立ちますか?

  • 場合によります *

6.解決策がある場合、新しいアレイを見つけるのにかかる時間はどれくらいですか?

実行時間はO(N^2)、単純な変換を使用している可能性があります (ただし、 と見なされますO(1))。

  • これは、重複をソリューションの一部と見なすか ( a bag )、そうでないか ( a set ) に依存します。

次に、アルゴリズム自体についてです。これは頭​​を鍛える良い方法のように思えますが、どちらかというと宿題のように聞こえるかもしれません。

于 2012-09-11T00:58:17.097 に答える