题目链接:https://leetcode.com/problems/sudoku-solver/description/
题目大意:数独。要求:每行每列、每个小3*3方块都是1-9的数,且不重复。
解法一:深搜。要注意细节:java传数组是地址,不是传值,每一次的改变都是在原数组上进行的。代码如下(15ms):
1 public static void main(String[] args) { 2 char[][] board = { 3 {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, 4 {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, 5 {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, 6 {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, 7 {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, 8 {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, 9 {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, 10 {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, 11 {'.', '.', '.', '.', '8', '.', '.', '7', '9'}, 12 }; 13 new Main().solveSudoku(board); 14 } 15 16 private static boolean flag = false; 17 public void solveSudoku(char[][] board) { 18 flag = false;//必须重置,因为flag这里作为全局变量存在,不重置的话,会导致下一个测试用例开始时flag的值就是true 19 dfs(0, 0, board); 20 /* for(int i = 0; i < 9; i++) { 21 for(int j = 0; j < 9; j++) { 22 System.out.print(board[i][j] + " "); 23 } 24 System.out.println(); 25 }*/ 26 } 27 public static void dfs(int x, int y, char[][] board) { 28 if(flag == true) { 29 return; 30 } 31 if(x == 9 && y == 0) {//找到第十行第一个数时,表示数独结束 32 flag = true; 33 return; 34 } 35 if(y == 9) {//查找下一行第一个数 36 dfs(x + 1, 0, board); 37 } 38 else if(board[x][y] != '.') {//查找下一个数 39 dfs(x, y + 1, board); 40 } 41 else if(board[x][y] == '.') { 42 for(int i = 1; i <= 9; i++) { 43 if(check(x, y, (char)(i + '0'), board) == true) { 44 board[x][y] = (char)(i + '0'); 45 dfs(x, y + 1, board); 46 if(flag == true) {//一旦找到一个结果就返回,不再回溯,否则会导致最后的数组,回溯回最原始的状态。且记住:java中数组作为参数是传地址 47 return; 48 } 49 board[x][y] = '.'; 50 } 51 } 52 } 53 } 54 public static boolean check(int x, int y, int value, char[][] board2) { 55 for(int i = 0; i < 9; i++) { 56 if(board2[x][i] == value) {//检验行 57 return false; 58 } 59 if(board2[i][y] == value) {//检验列 60 return false; 61 } 62 } 63 x = x / 3 * 3; 64 y = y / 3 * 3; 65 for(int i = x; i < x + 3; i++) {//检验每个3*3方格 66 for(int j = y; j < y + 3; j++) { 67 if(board2[i][j] == value) { 68 return false; 69 } 70 } 71 } 72 return true; 73 }