0

だから私のコードに少し問題があります..同じ整数の行と列をクロスチェックすることを想定しています。

これは私がこれまでに持っているものです..しかし、私がそれを実行すると、最初の整数のみをチェックするように見えます。(たとえば、数独ボードの最初の行は次のようになります。1 2 2 2 2 2 2 2 2 2)明らかな複数の2は検出されませんが、入力を1 1 2 2 2 2 222に変更するとエラーが発生します。この場合、複数の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++;
            }
4

3 に答える 3

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;
}

そうすれば、コードの保守/読み取りがはるかに簡単になります。上記のコードはテストされていませんが、ほぼ正しいはずです。

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

于 2012-02-16T18:12:06.840 に答える
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
于 2012-02-16T18:19:30.053 に答える
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 次元配列を渡すだけでよいことに注意してください。3x3 の領域をチェックする必要があるため、正方形は 2 次元配列です。staticこれらのメソッドの機能は数独ボード インスタンスから独立しているため、これらのメソッドを扱うこともできます。

編集:行/列/正方形の検証に関する提案は、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;
于 2012-02-16T18:19:39.927 に答える