我有一个用Java编写的程序,用于检查一个数独是否有效。我有两个方法,第一个方法是检查所有列、子网格和行的总和是否为45,第二个方法是检查整个数独的总和是否为405,如果是,则数独有效。我正在寻找一个反例,即输入一个有效的数独,但程序却判定其无效。以下是代码:
public class test_checker { static final boolean valide=true; static final boolean non_valide=false; // 验证每个子网格是否有效 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; } //通过每行、每列和每个子网格的总和验证数独 static boolean Checker1(int a[][]){ int sum=0; //检查行 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; } //检查列 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; } //检查子网格 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; } //通过整个数独的总和验证 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 !"); }}
回答:
正如@某人所说
你应该问的是是否存在一个无效的9×9网格,但它仍然满足你的标准。
我想到的最简单的两个例子是:
{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]的区间内。