2017-03-01 6 views
-1

は、私は数独が有効であるかどうかを確認し、Javaのプログラムを持って、私は2つのメソッドを持って、最初は、すべての列の合計を確認するサブグリッド、行と45であれば教えて、とあります2番目は、すべてのスドクの合計が405かどうかをチェックしているので、スドクが有効なので、私はカウンターの例を探しています。その入力では、有効なスドクがありますが、これはコードです:数独ソリューションチェッカー

public class test_checker { 
    static final boolean valide=true; 
    static final boolean non_valide=false; 

    // verify every sub-grid if it is valid 
     static boolean check_subgrid(int a[][],int ei,int ej){ 
      int sum=0; 
      for(int i=ei;i<ei+3;i++){   
       for(int j=ej;j<ej+3;j++){ 
        sum=sum+a[j][i]; 
       } 
      } 
      if(sum!=45) return non_valide; 
      else return valide; 
     } 
     //verify a sudoku by sum of every row & column & sub-grid 
     static boolean Checker1(int a[][]){ 
      int sum=0; 
      //check row 
      for(int i=0;i<9;i++){ 
       sum=0; 
       for(int j=0;j<9;j++){ 
        sum=sum+a[i][j]; 
       } 
       if(sum!=45) return non_valide; 

      } 
      //check column 
      for(int i=0;i<9;i++){ 
       sum=0; 
       for(int j=0;j<9;j++){ 
        sum=sum+a[j][i]; 
       } 
       if(sum!=45) return non_valide; 
      }  
      //check sub-grid 
      for(int i=0;i<9;i=i+3){ 
       for(int j=0;j<3;j=j+3){ 
        if(check_subgrid(a,i,j)==non_valide) return non_valide; 
       } 
      } 
      return valide; 
     } 
     //verify by sum of all sudoku 
     static boolean Checker2(int a[][]){ 
      int sum=0; 
      for(int i=0;i<9;i++){   
       for(int j=0;j<9;j++){ 
        sum=sum+a[i][j]; 
       } 
      } 
      if(sum!=405) return non_valide; 
      else return valide; 
     } 


    public static void main(String[] args) { 
     int [][] sudoku = 
      { 
       {1,2,3,4,5,6,7,8,9}, 
       {4,5,6,7,8,9,1,2,3}, 
       {7,8,9,1,2,3,4,5,6}, 
       {3,1,2,9,7,8,6,4,5}, 
       {6,4,5,3,1,2,9,7,8}, 
       {9,7,8,6,4,5,3,1,2}, 
       {2,3,1,5,6,4,8,9,7}, 
       {5,6,4,8,9,7,2,3,1}, 
       {8,9,7,2,3,1,5,6,4} 
      }; 
     if(Checker1(sudoku)) System.out.println("it's valide (checker1)!"); 
     else System.out.println("it's not valide !"); 
     if(Checker2(sudoku)) System.out.println("it's valide (checker2) !"); 
     else System.out.println("it's not valide !"); 

    } 

} 
+0

陽性の結果が得られます(繰返し数は合計45である)。番号が繰り返されないかどうかを確認する必要があります。 –

+0

この質問はhttp://codereview.stackexchange.comに適していますか? – Paul

+5

あなたの基準を満たしていない有効な9x9数独はありません。それは、有効な数独の定義から直接得られます。あなたが*求めているべき質問は、無効*** *** 9×9グリッドがあるかどうかです。それにもかかわらず、***はあなたの基準を満たしています。 –

答えて

2

@ジョンボリンジャーが言ったように

あなたが尋ねるべきである

が無効9で9グリッド012それがあるかどうかでありますそれでもはあなたの基準を満たしています。私の心に来る

最も簡単な2例は、以下のとおりです。

{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5} 

とあなたの例、あなたが9のの代わりに0の代わりに1の と10のを置く場所。各フィールドが行、列、サブグリッドで区別され、間隔が[1,9]であることを確認します。

1

checker2の場合、2つの値の2つの値を反転することができます。ここで私は4と1行目と2行目の1を反転し、明らかにそれは無効な数独ですが、checker2はあなたにそれが偽陽性を持つことができるので、あなたは、数字の合計を確認するべきではありません

  {4,2,3,4,5,6,7,8,9}, 
      {1,5,6,7,8,9,1,2,3}, 
      {7,8,9,1,2,3,4,5,6}, 
      {3,1,2,9,7,8,6,4,5}, 
      {6,4,5,3,1,2,9,7,8}, 
      {9,7,8,6,4,5,3,1,2}, 
      {2,3,1,5,6,4,8,9,7}, 
      {5,6,4,8,9,7,2,3,1}, 
      {8,9,7,2,3,1,5,6,4}