37.Sudoku Solver

题目链接: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     }
View Code

 

posted on 2018-01-11 16:09  二十年后20  阅读(188)  评论(0编辑  收藏  举报

导航