1
0から7の数字で塗りつぶした8×8の配列を作成する必要がありますが、行と列に重複はありません。また、生成されるシーケンスはランダムでなければならない。例えば行と列に重複のない2次元配列
:任意の行/列には重複が存在しないので
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 0
2 3 4 5 6 7 0 1
3 4 5 6 7 0 1 2
4 5 6 7 0 1 2 3
5 6 7 0 1 2 3 4
6 7 0 1 2 3 4 5
7 0 1 2 3 4 5 6
は、有効な配列です。
私はこのコードを使い始めましたが、選択できる数字が不足していると明らかにクラッシュします。
int[][] array = new int[8][8];
List <Integer> numbers = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7));
Collections.shuffle(numbers);
//populate first row
for(int i = 0; i <= 7; i++) {
array[0][i] = numbers.get(i);
}
//populate the rest of array
for(int i = 1; i <= 7; i++) {
Collections.shuffle(numbers);
for(int j = 0; j <= 7; j++) {
Deque<Integer> numbersToPickFrom = new ArrayDeque<>(numbers);
//Remove duplicates from above
for (int k = 0; k < i ; k++)
numbersToPickFrom.remove(array[k][j]);
//Remove duplicates from left
for (int k = 0; k < j ; k++)
numbersToPickFrom.remove(array[i][k]);
array[i][j] = numbersToPickFrom.pop();
System.out.print(array[i][j]+" ");
}
System.out.print("\n");
}
出力:
3 4 5 7 6 0 2 1
4 5 6 2 0 7 3 Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayDeque.removeFirst(ArrayDeque.java:280)
at java.util.ArrayDeque.pop(ArrayDeque.java:517)
at kamisado_logic.Board.createRandomSquares(Board.java:209)
at kamisado_util.ThreadDriver.main(ThreadDriver.java:17)
私のアプローチは、最高のものからfaaarであるように私は感じて、任意のヒントをいただければ幸いです。
(それは擬似コードの株式メンバーが)、これはランダムなことになっていますか?次の行で明らかに '0 1 2 3 4 5 6 7'と '1 2 3 4 5 6 7 0'はあまりランダムではないからです。しかし、ランダム性を持たないユニークな行として構築する必要がある場合は、次のようなものが使えます:for(int i = 0; i <8; i ++){for(j = 0; j <8; j ++ ){array [i] [j] =(i + j)%8; }} '(*貧弱な書式設定をしてください*) – SpencerD
うん、それはランダムであると言われているのを忘れてしまった。 – Wojtek
最も単純な方法は、再帰/バックトラック/ [深さ優先検索](https://en.wikipedia.org/wiki/Depth-first_search)を使用することです。 – Dukeling