0

このプログラムの機能:

このプログラムは、クラスから値を取得し、数独パズルの開始値として使用します。これらを典型的な数独 9x9 グリッドで印刷します。次に、プログラムはユーザーにグリッド上の座標点とそこに入れる値を与えるように促します。現在、私が取り組んでいるのは、ユーザーが入力した値がこのパズルを解決するために有効であることを確認することです. パズルが完成し、各列、行、および 3x3 の正方形に繰り返される値がなくなると、ゲームは終了し、出力は "Puzzle Complete" になります。

現時点では、私のプログラムは列と行の繰り返し値を正常にチェックしていますが、各 3x3 正方形のチェックをどこから始めればよいかわかりません。

このパズルの数字は 9x9 配列に保存されます。

基本的に:配列の各3x3部分で繰り返される値をチェックする方法に関するヒントはありますか?

4

3 に答える 3

0

数独ボードの保管方法によって異なります。2D 配列として保存する場合、ユーザーが新しい値を入力するために選択した 3x3 ボックスをロジックで識別し、行と列のセクションをチェックするために既に必要なコードを使用できます。

また、9 セットのコレクションを持つこともできます。各セットは、特定の 3x3 ブロックに対応します。したがって、ユーザーが値を追加したい場所の座標を選択すると、指定されたセットを選択し、セットでadd操作を実行します。

セットは繰り返しを許可しないため、数値がセットに既に存在する場合、addメソッドは戻ります。falseこれにより、重複する値を特定することもできます (ただし、配列オプションとは異なり、ユーザーが 3x3 グリッドから値を削除することを選択した場合は、セットを更新する必要もあります)。

于 2012-10-19T06:24:26.803 に答える
0

大きな 9x9 配列の代わりに、3x3 配列の 3x3 配列を格納します。または、計算を容易にするために両方を実行します (さらに 81 バイトのデータを格納する (私が望むフィールドにはバイトを使用しますか?)とにかくそのようなゲームをプレイする)。

于 2012-10-19T06:20:25.837 に答える
0

まったく同じ問題を解決するために、約 4 年前に C で次のコードを書きました。int 配列は 9x9 グリッドでした。「index」は、0~8 行目、0~8 列目、0~8 ボックスを指定します。

int checkBox(int a[][9], int index)
{
    int i, j, isValid = 1;
    int m, n;
    for(i = 3*(index%3) ; isValid && (i < (3*(index%3) + 3)); i++)
    {
        for(j = 3*(index/3); isValid && (j < (3*(index/3) + 3)); j++)
        {
            for(m = (3*(index%3)) ; isValid && (m < (3*(index%3) + 3)); m++)
            {
                for(n = 3*(index/3); isValid && (n < (3*(index/3) + 3)); n++)
                {
                    if(isValid && (a[m][n] == 0) || ((i != m) || (j != n)) && (a[i][j] == a[m][n]))     //select given element and compare others to it
                    {                                                                         //if any element is the same that is not itself then the sudoku is not valid
                        isValid = 0;                                                  //this checks for 3x3 box
                    }                                                               
                }                                               
            }                                                   
        }
    }
    return isValid;
}   

基本的に、特定のボックスが選択されるまでインデックスを操作し、そのボックスですべての数字をチェックして、何らかの一致があるかどうかを確認しました。一致した場合、数独は無効です。

最後に、次のように有効性を確認しました。

int checkSudoku(int a[][9])                                     //check every row, column and box
{                                                   //if there is no contradiction then it is valid
    int i, isValid = 1;
    for(i = 0; isValid && (i < 9); i++)
    {
        isValid = (checkLine(a, i) && checkColumn(a, i) && checkBox(a, i));
    }
    return isValid;
}

もちろん、Java が単なる配列管理であることを考えると、同じ概念を Java に適用できます。

于 2014-07-07T08:45:01.853 に答える