2011-07-23 18 views
0

私は「ブルートフォース」ランダムアプローチを使用して、スドクジェネレータを作成しています。私はあなたが原点からすべての3x3の正方形のを確認してくださいここで、(チェック「ボックス」や「地域」を実施することを決定した数独 - 地域テスト

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

:私はちょうど良いコードを使用して、重複番号についてのx/y軸をチェックすることができました)私はちょうどコードの周りに私の頭を包むように見えることはできません。これまで私が行ってきたことがあります。私はかなり理解できないところ、私の論理エラーの嘘(記録のためのプログラムは、このコードで実行されますが、適切に領域をチェックしません)regionCheck.javaの

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

内容:

 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

試験のための領域を「選択」し、それを反復処理する単純方法上の任意の助けをいただければ幸いです。

+0

[Javaでの数独作成](http://stackoverflow.com/questions/4477288/creating-a-sudoku-in-java) – Cubbi

答えて

1

地域のテスト、 テストは、各地域に1から9までの数字が重複せずにあることを意味します。

5月実装することができ:垂直、水平、及び3x3の領域のためのループの

  1. 使用します。
  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をテストすることができます(私は019の間にいくつかの特別な意味と数字であると仮定し、各桁 ため

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カウント数を有効です)。

1

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

幸いです!