数独 dfs(深搜) + 回溯
import java.util.*;
/**
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
*
* */
public class _数独游戏 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
char[][] table = new char[9][];
for (int i = 0; i <9; i++) {//处理输入
table[i]=sc.nextLine().toCharArray();
}
dfs(table,0,0);//调用深搜方法
}
private static void dfs(char[][] table, int x, int y) {
if(x==9) {//当x=9的时候退出
print(table);
System.exit(0);//终止系统
}
if(table[x][y]=='0') {//等于0的时候这个位置没有填入数字
for (int k = 1; k <=9; k++) {//从1到9进行试探的填入
if(Check(table,x,y,k)) {//检查k填到这个位置是否合法的
table[x][y]=(char)('0'+k);
dfs(table, x+(y+1)/9, (y+1)%9);//处理下一个状态
};
}
table[x][y]='0';//回溯
}else {
dfs(table, x+(y+1)/9, (y+1)%9);//处理下一个状态
}
}
private static boolean Check(char[][] table, int i, int j, int k) {
//检查同行同列
for (int l = 0; l < 9; l++) {
if(table[i][l]==(char)('0'+k))return false;
if(table[l][j]==(char)('0'+k))return false;
}
//检查小九宫格
for (int l =(i/3)*3; l <(i/3+1)*3; l++) {
for (int m =(j/3)*3; m <(j/3+1)*3; m++) {
if(table[l][m]==(char)('0'+k))return false;
}
}
return true;
}
//打印方法
private static void print(char[][] table) {
for (int i = 0; i < 9; i++) {
System.out.println(new String(table[i]));
}
}
}