2012-02-16 6 views
0

私のコードでは少し問題があります。同じ整数の行と列をチェックすることが考えられます。数独チェッカー2d配列Java

これは私がこれまで行ってきたことですが、私が実行すると、最初の整数だけをチェックするようです。 1 2 2 2 2 2 2 2 2 2 2)それは明白な倍数2を検出しませんが、もし私が入力を1に変えれば、エラーは起こりますこの場合複数の1のうちの1つを選択する。列を通過するように私のループを微調整するための提案は複数ある?

public static void validate(final int[][] sudokuBoard) { 
    int width = sudokuBoard[0].length; 
    int depth = sudokuBoard.length; 

    for (int i = 0; i < width; i++) { 
      int j = i; 
      int reference = sudokuBoard[i][j]; 

      while (true) { 
       if ((j >= width) || (j >= depth)) { 
        break; 
       } 
       else if (i == j){ 
        // do nothing 
       } 
       else if (j < width) { 
        int current = sudokuBoard[i][j]; 

        if (current == reference) { 
         System.out.print("Invalid entry found (width)" + "\n"); 
         System.out.print(current + "\n"); 


         // invalid entry found do something 
        } 
       } else if (j < depth) { 
        // note reversed indexes 
        int current = sudokuBoard[j][i]; 

        if (current == reference) { 
         System.out.print("Invalid entry found (depth)" + "\n"); 
         System.out.print(current + "\n"); 

         // invalid entry found do something 
        } 
       } 
       j++; 
      } 
+0

「i」と「j」とは何ですか? '(i == j)'のときに何もしないのですか? –

+0

私はそれがsudokuBoard [1]/[2]/[3] [3]を横切ってボードを降りるときに問題を抱えました。 –

+0

私は分かりません。なぜあなたは '[0] [0]'、 '[1] [1]'などをスキップしたいのですか? –

答えて

3

コードがもっと複​​雑です。なぜあなたはいくつかの異なる機能に分割することができるときにすべてを1つの機能に入れますか?

public static void Validate(final int[][] sudokuBoard) 
{ 
    int width = sudokuBoard[0].length; 
    int depth = sudokuBoard.length; 

    for(int i = 0; i < width; i++) 
     if(!IsValidRow(sudokuBoard, i, width)) 
     { 
      //Do something - The row has repetitions 
     } 
    for(int j = 0; j < height; j++) 
     if(!IsValidColumn(sudokuBoard, j, width)) 
     { 
      //Do something - The columns has repetitions 
     } 
} 

static bool IsValidRow(int[][] sudokuBoard, int referenceRow, int width) 
{ 
    //Compare each value in the row to each other 
    for(int i = 0; i < width; i++) 
    { 
     for(int j = i + 1; j < width; j++) 
     { 
      if(sudokuBoard[referenceRow][i] == sudokuBoard[referenceRow][j]) 
       return false 
     } 
    } 
    return true; 
} 

static bool IsValidColumn(int[][] sudokuBoard, int referenceColumn, int height) 
{ 
    //Compare each value in the column to each other 
    for(int i = 0; i < height; i++) 
    { 
     for(int j = i + 1; j < height; j++) 
     { 
      if(sudokuBoard[i][referenceColumn] == sudokuBoard[j][referenceColumn]) 
       return false 
     } 
    } 
    return true; 
} 

こうして、あなたのコードははるかに簡単に保守可能/可読です。上記のコードはテストされていませんが、正しいと思われます。

このコードを段階的にデバッグして、実際に何が起こっているかを理解することをお勧めします。

+0

このトピックに関するいくつかの質問を投稿したことを知りましたので、ここですべて回答することにしました。あなたがよく分かっていれば、自分でスクエアの点検をすることができるはずです! – Msonic

+1

すべての洞察力と方向感に感謝します。別のブール値に分解することは、それをよりよく理解するのに役立ちます。 :) –

+0

あなたの質問に適切に答えられたと思う場合は、その隣の緑色のチェックマークをクリックして回答を受け入れることができます。 :) – Msonic

0

スードクの制約(n個のセルの行には1-nのみが含まれている必要があります)を指定すると、n^2個の検索(行または列ごと)は必要ありません。あなたが見た数字を示すビット配列。行をチェックするための擬似コードは、列についても同様です。

for i in 0 to depth-1 // rows 
    boolean seen[] = new seen[width]; 
    for j in 0 to width-1 // columns 
    if seen[board[i][j]-1] == true 
     duplicate number 
    else 
     seen[board[i][j]-1] = true 
0

私は機能を小さなブールチェックに分割します。このようにして、行単位、列単位、正方形単位で検証することができます。例えば、

private boolean isValidRow(int[] row) { 
    // Code here to check for valid row (ie, check for duplicate numbers) 
} 

private boolean isValidColumn(int[] column) { 
    // Code here to check for valid column 
} 

private boolean isValidSquare(int[][] square) { 
    // Code here to check for valid square 
} 

行と列は1次元配列を渡すだけでよいことに注意してください。正方形は、3×3の領域を確認する必要があるため、2次元の配列です。また、これらのメソッドをstaticとして扱うこともできます。その機能はSudokuボードインスタンスとは独立しているからです。

編集:行/列/四角形の検証に関する提案は、HashSetを使用することです。セットには特定の値の要素が1つしかないので、要素を追加して障害を探すことができます。例:

HashSet<Integer> hs = new HashSet<Integer>(); 
for(int i = 0; i < 9; i++) { 
    if(!hs.add(integerArray[i])) // HashSet.add returns 'false' if the add fails 
           // (ie, if the element exists) 
     return false; 
} 
return true;