2017-03-01 23 views
-1

我在Java程序,檢查,如果數獨是有效還是無效,我有兩種方法,第一種是檢查所有列,分格,行之和告訴我們,如果是45,而二是檢查是否所有數獨的總和是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)。你應該檢查數字是否不重複。 – 2017-03-01 19:54:48

+0

這個問題更適合http://codereview.stackexchange.com嗎? – Paul

+5

當然,沒有有效的9x9數獨不符合您的標準。它直接來自有效的數獨的定義。你*應該問的問題是,是否有一個*** 9×9的網格,但*** ***符合你的標準。 –

回答

2

正如@約翰布林說

你應該問的是是否有一個無效的9×9格是 仍然滿足您的標準。

最簡單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} 

和你的榜樣,在那裏你會放的0而不是1的 和10的,而不是9的的。確保每個字段在行,列和子網格中不同,間隔爲[1,9]。

1

對於checker2你可以顛倒兩排的兩個值。在這裏,我倒4和第一排和第二排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}