0

こんにちは、完成したボードのソリューションが正しいことを確認する数独チェッカーに取り組んでいます。私は現在、ブロック内をチェックする方法に困惑しています。現在、左上のブロック(Block1)をチェックしている次のようなブール値があります。私が確信していないのは、それを設定するパラメータと、2 つの for ループを正常に実行する方法です。

問題は、3x3 の正方形に凝縮された 2 次元配列のセクションをチェックし、その領域の整数が繰り返されていないかどうかを確認したいことです。行に繰り返し整数と列があるかどうかを確認するこのコードを作成した同様のコードがあります。

static boolean isBlock1Valid(int[][] sudokuBoard, int referenceRow, int referenceColumn)
{

    for(int i =0; i<2;i++){
        for(int j=0; j<2; j++){
            if(sudokuBoard[i][j]==sudokuBoard[i][j])
                return false;
        }
    }
    return true;
}//end of isBlock1Valid

これは、ブロックチェッカーを作成するために参照として使用した行チェッカーです

       static boolean 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;
}
4

4 に答える 4

3

宿題なのでヒントだけ。モジュロ 3 ( i % 3) と 3 による整数除算 ( i / 3) を使用して、座標 0 .. 8 を 3 つの部分に分割し、その部分にインデックスを付けることができます。

于 2012-02-16T21:17:47.300 に答える
0

あなたのIsValidRowメソッドでは、2つのネストされたループを使用しました。最初の行は行全体をループし、2番目の行は行の残りの部分をループして値が繰り返されるかどうかを確認します。isBlock1Validメソッドでは、2つのネストされたループも使用します。ただし、ここでは、y座標に外側のループを使用し、x座標に内側のループを使用します。一緒に彼らはあなたの最初のループがすることをしますIsValidRow。セルのグループ全体をループします。ボックスの残りの部分をループする2番目のループを実装する必要があります。残念ながら、これはネストされたループでは簡単ではありません。しかし、Joop Eggenが言ったように、モジュロ除算と整数除算を使用して、座標について別の見方をすることができます。たとえば、ボックス内j % 3 + (i % 3) * 3のインデックスであると言うことができ(j, i)ます。この方法では、次のように2つのループのみが必要になりますIsValidRow

static boolean isBlock1Valid(int[][] sudokuBoard)
{
    for(int i = 0; i < 9; i++)
    {
        for(int j = i+1; j < 9; j++)
        {

            if(sudokuBoard[i/3][i%3] == sudokuBoard[j/3][j%3])
                return false;

        }
    }
}
于 2012-03-03T00:19:38.563 に答える
0

それらを合計するだけです。45 の場合は正常、それ以外の場合は false — もちろん、既に行と列をチェックしていると仮定します。また、各地域を一意の数字で示す別のグリッドを保持することをお勧めします。そうすれば、ループを繰り返して、他の多くの優れた操作を実行できます。

于 2015-05-31T14:44:32.030 に答える
0

与えられたコードで何をしたいのかよくわかりません。ただし、このメソッドは常に false を返します。

必要に応じて、1 つのブロックに各要素のインスタンスが 1 つだけあることを確認してください。次に、1つの解決策は、一種のチェックリストを用意することです。

boolean[] seen = new boolean[9];

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        if (seen(sudokuBoard[referenceColumn+i][referenceRow+j])) return false;
        else seen[sudokuBoard[referenceColumn+i][referenceRow+j]) = true;
return true;
于 2012-02-16T21:14:42.920 に答える