import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { int[][] data = new int[9][9]; Scanner in = new Scanner(System.in); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { data[i][j] = in.nextInt(); } } dfs(0, data); } public static void dfs(int pos, int[][] data) { if (pos == 81) { print(data); System.exit(0); } int i = pos / 9; int j = pos % 9; if (data[i][j] == 0) { for (int alt = 1; alt < 10; alt++) { if (checkAlt(data, i, j, alt)) { data[i][j] = alt; dfs(pos + 1, data); } } data[i][j] = 0; // 恢复现场 } else { dfs(pos + 1, data); } } public static boolean checkAlt(int[][] data, int i, int j, int alt) { for (int k = 0; k < 9; k++) { if (data[i][k] == alt) { return false; } } for (int k = 0; k < 9; k++) { if (data[k][j] == alt) { return false; } } int row = i / 3 * 3; int column = j / 3 * 3; if (data[row][column] == alt || data[row][column + 1] == alt || data[row][column + 2] == alt || data[row + 1][column] == alt || data[row + 1][column + 1] == alt || data[row + 1][column + 2] == alt || data[row + 2][column] == alt || data[row + 2][column + 1] == alt || data[row + 2][column + 2] == alt) { return false; } return true; } public static void print(int[][] data) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { System.out.print(data[i][j] + " "); } System.out.println(); } } } 将格子依次编号为0,1,2,...,80, 依次遍历每个格子pos, int i = pos / 9 int j = pos % 9 如果格子的数值为0,则依次尝试填入1,2,3,4,5,6,7,8,9. 和第i行,第j列以及所在九宫格已有的数字不重复即可。 如果格子的数值不为0,则继续 dfs(pos+1,data) 如果pos达到了81,则说明所有格子里面的数值是符合要求的。 需要注意的是递归调用完成之后没有完成则需要恢复现场。