37.Sudoku Solver

題目連接: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     }
View Code
相關文章
相關標籤/搜索