boolean[][] address = newboolean[9][27]; // 默认false for (int i = 0; i 9; i++) { for (int j = 0; j 9; j++) { if (board[i][j] != '.') { int index = board[i][j] - '1'; // board数组保存的是字符,需换成相应的整数 // 宫格的索引 int k = i / 3 * 3 + j / 3; // 记录某数字存放的位置 address[index][i] = true; address[index][j + 9] = true; address[index][k + 18] = true; } } }
得出来的address的值如下:
下标 : 值[一维数组] 0 : F T F F T F F T F F F F T T F F F T F T F F F T F T F 1 : F F F F F T T F F F F F F T F T F F F F F F T F F F T 2 : T F F T T F F F F F T F F F T F F T T F F F T T F F F 3 : F F F F T F F T F T F F T F F F F F F F F T F F F T F 4 : T T F F F F F T F T F F F F T F F T T T F F F F F F T 5 : F T T T F T T F F T T F F T F F T T T F T F T T T F F 6 : T F F F F T F F T T F F F T F F T F F T F T F F F F T 7 : F F T T T F T F T T F T T T F F T F T F F T T F F T T 8 : F T T F F F F T T F T F F T T F F T T T F F F F F T T
publicvoidsolveSudoku(char[][] board){ // 创建直接寻址表 记录某数字存放的位置 空间换时间 boolean[][] address = newboolean[9][27]; for (int i = 0; i 9; i++) { for (int j = 0; j 9; j++) { if (board[i][j] != '.') { int index = board[i][j] - '1'; // board数组保存的是字符,需换成相应的整数 // 宫格的索引 int k = i / 3 * 3 + j / 3; // 记录某数字存放的位置 address[index][i] = true; address[index][j + 9] = true; address[index][k + 18] = true; } } } // 回溯算法,和dfs类似,dfs一般做遍历,没有回溯 track(board, address, 0, 0); }
privatebooleantrack(char[][] board, boolean[][] address, int i, int j){ // 找寻空位置 while (board[i][j] != '.') { if (++j >= 9) { i++; j = 0; } if (i >= 9) returntrue; // 到这里说明数独已填入的数字是有解的 } for (int index = 0; index 9; index++) { // 宫格索引 int k = i / 3 * 3 + j / 3; if (!address[index][i] && !address[index][j + 9] && !address[index][k + 18]) {