題目連接:https://leetcode.com/problems/sudoku-solver/description/java
題目大意:數獨。要求:每行每列、每一個小3*3方塊都是1-9的數,且不重複。數組
解法一:深搜。要注意細節:java傳數組是地址,不是傳值,每一次的改變都是在原數組上進行的。代碼以下(15ms):ide
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 }