public class Test7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] arr = {
{0,9,5,0,2,0,0,6,0}, 1 每行不能有重复数字 2每列不能有重复数字 3每个九宫格不能有重复数字
{0,0,7,1,0,3,9,0,2},
{6,0,0,0,0,5,3,0,4},
{0,4,0,0,1,0,6,0,7},
{5,0,0,2,0,7,0,0,9},
{7,0,3,0,9,0,0,2,0},
{0,0,9,8,0,0,0,0,6},
{8,0,6,3,0,2,1,0,5},
{0,5,0,0,7,0,2,8,3}};
dfs(arr,0,0);
}
public static void dfs(int[][]arr,int row,int colum) {
if (row==8 && colum==9) {//错误的根源,如果找到了就要打印出来,
//如果return返回那么程序认为这一条正确解也是错的,那么就所有路都不通了。
for(int i=0;i<9;i++) {//打印最终答案
for(int j=0;j<9;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
return;
}
if(colum==9) {//如果列数等于9,则进入到下一行继续找到
row++;
colum=0;
}
if(arr[row][colum]==0) {//如果是0,代表未填充
//判断给i行j列放1-9中的任意一个数是否能满足规则
for(int i=1;i<=9;i++) {
if(isOK(arr,i,row,colum)) {
//将该值赋给该空格,然后进入下一个空格
arr[row][colum]=i;
dfs(arr,row,colum+1);
//若下一个返回不符合,则需要将该值置位0
arr[row][colum]=0;
}
}
} else{
dfs(arr,row,colum+1);
}
}
public static boolean isOK(int[][] arr,int target,int row,int colum) {
for(int i=0;i<9;i++) {//判断这一列是否有相同的
if(arr[i][colum]==target) {
return false;
}
}
for(int i=0;i<9;i++) {//判断这一行是否有相同的
if(arr[row][i]==target) {
return false;
}
}
int ii=row/3;
int jj=colum/3;
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
if(arr[ii*3+i][jj*3+j]==target) {
return false;
}
}
}
return true;
}
}