分析:
深搜:很常规的从行开始遍历,遍历到底后,移到下一列再次遍历其行。如果遇到无法填入的情况则放回上一级尝试其他可选数字。
样例:
输入:
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
输出:
125346897
831467925
276918543
489625371
912873456
753291684
367584219
694752138
548139762
import java.util.Scanner;
public class _12dfs数独游戏 {
//可以以/和%的方式让标记进行换行和换列
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
char[][] matrix = new char[9][9];
for (int i = 0; i < 9; i++)
matrix[i] = sc.next().toCharArray();
dfs(matrix, 0, 0);
}
static void dfs(char[][] matrix, int i, int j) {
if (i == 9) {
for (int a = 0; a < 9; a++)
System.out.println(matrix[a]);
System.exit(0);
}
if (matrix[i][j] == '0') {
for (int k = 1; k < 10; k++) {
if (check(matrix, i, j, k + '0')) {
matrix[i][j] = (char) (k + '0');// 确定当前状态
dfs(matrix, i + (j + 1) / 9, (j + 1) % 9);// 转移到下一个状态
}
}
matrix[i][j] = '0';// 回溯
} else {
dfs(matrix, i + (j + 1) / 9, (j + 1) % 9);// 转移下一个状态
}
}
private static boolean check(char[][] matrix, int i, int j, int k) {
// TODO Auto-generated method stub
for (int a = 0; a < 9; a++)
if (matrix[i][a] == k)
return false;
for (int a = 0; a < 9; a++)
if (matrix[a][j] == k)
return false;
return true;
}
}