2017-04-23 14 views
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

(それは擬似コードの株式メンバーが)、これはランダムなことになっていますか?次の行で明らかに '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

+0

うん、それはランダムであると言われているのを忘れてしまった。 – Wojtek

+0

最も単純な方法は、再帰/バックトラック/ [深さ優先検索](https://en.wikipedia.org/wiki/Depth-first_search)を使用することです。 – Dukeling

答えて

2

あなたの問題を取り除くいくつかの制約で、数独グリッドを生成すると非常によく似ています:

  • あなたが唯一の8行と列の代わりに、9
  • を持っているあなたはsubsquaresで一意の値を持っている必要はありません

あなたはsudoku生成アルゴリズムを見て、必要のない部分を削除することができます。 ここではいくつかのヒントが開始するために、次のとおりです。