0

「力ずくの」ランダム性アプローチを使用して、数独ジェネレーターを作成しています。コードを使用して、x/y軸の重複番号を問題なくチェックできました。

for(l=0; l<9; l++){//Makes all vertical work.
                   if(sudoku[l][j] == temp){
                       isUsed=true;
                   }
                }                  
                for(m=0; m<9; m++){//makes all horizontal work
                   if(sudoku[i][m] == temp){
                       isUsed=true;
                   }
                }

「ボックス」または「リージョン」チェック(原点から3x3の正方形ごとにチェックする)を実装することにしましたが、コードに頭を悩ませているようには見えません。これが私がこれまでにしたことです。論理エラーがどこにあるのか完全にはわかりません(記録のために、プログラムはこのコードで実行されますが、領域を適切にチェックしません)

rowbase = i-(i%3);
                if(i==2  || i==5 || i==8 ){
                    if(rowbase == 0 || rowbase == 3 || rowbase == 6){
                       isUsed= RegionCheck.RegCheck(rowbase, sudoku);
                    }
                }

regionCheck.javaの内容:

       boolean okay = false;
    int[] regionUsed = new int[9];
    int i=0, j=0, regionTester=0, counter=0, numcount;
    for (i=regionTester; i<regionTester+3; i++){
        for (; j<3; j++){
           regionUsed[counter]=sudoku[i][j];
           counter++;
        }
    }
    for(i=0; i<9; i++){
        numcount=regionUsed[i];
        for(j=0; j<9; j++){
            if(j==i){
                //null
            }
            else if(numcount == regionUsed[j]){
                okay=false;
            }
        }
    }

    return okay;

途中のどこかで迷子になり、リージョンを「選択」してリージョンを反復処理する方法がわかりません。

完全なソースはこちら:http: //ideone.com/FYLwm

テストする領域を「選択」して、それを反復処理する方法についてのヘルプは、私が本当にアイデアがないので、非常にありがたいです。

4

2 に答える 2

1

あなたはそれを少し抽象化する必要があります。このように考えると、どの領域(ボックス、列、行)も値(および空の値)のリストにすぎません。x値を領域に挿入できるかどうかを確認するには、Rのすべての値Rを値のリストとして表すだけですL。今あなたがする必要があるのはL含まれているかどうかを確認することですx

幸運を!

于 2012-05-11T13:28:19.263 に答える
0

リージョンをテストすることの意味がわかりません。テストとは、各リージョンに1から9までのすべての数字が重複することなく含まれていることを意味すると思います。

5月の実装を行うことができます:

  1. 垂直、水平、および3x3領域のforループを使用します。
  2. 水平または垂直の領域を含む、各領域の位置を持つテーブルを使用します。

私のおすすめは2つ目です。テーブルがある場合、リージョンにアクセスするループは1回実装されます。一方、1つ目は、垂直/水平/3x3に対して3つの同様のループを実装する必要があります。

テーブルを生成するコードは次のとおりです。

for(int i=0, k=0; i<9; i++) {
    // generate vertical regions
    for(int j=0; j<9; j++)
        table[k][j] = new table_t(i, j);
    k++;
    // generate horizontal regions
    for(int j=0; j<9; j++)
        table[k][j] = new table_t(j, i);
    k++;
    // generate 3x3 regions
    for(int j=0; j<9; j++)
        table[k][j] = new table_t((i/3)*3+j/3, (i%3)*3+j%3);
    k++;
}

垂直または水平領域を生成するコードは読みやすいです。ただし、3x3領域の生成について説明する必要があります。変数iは0から8まで取得され、((i/3)*3(i%3)*3)はそれぞれ3x3領域のコーナーを指します。そして、(+j/3+j%3)はリージョン内の各ボックスを移動します。

sudokuまた、次のコードを使用して、マトリックスが準拠しているかどうかをテストできます。

boolean okey = true;
for(int i=0; i<27; i++) {
    int [] counter = new int[10];
    for(int j=0; i<10; i++)
        counter[i]=0;
    for(int j=0; j<9; j++)
        counter[ sudoku[table[i][j].x][table[i][j].y] ] ++;
    boolean ok = true;
    for(int j=0; j<9; j++)
        if(counter[j+1]!=1)
            ok = false;
    if(!ok)
        okey = false;
}

配列counterは、各桁の出現数をカウントします(私0は、いくつかの特別な意味と、との間の桁19有効であると想定しています)。

于 2011-07-23T12:36:02.957 に答える