[LeetCode] 37. Sudoku Solver

解数独。需要先做36题。做完36题,37题需要做的就是根据规则填充input。填充的规则是如果当前坐标上是一个点(.)的话,尝试放1-9之间的一个数字,放进去之后判断两件事,1是是否有效(这个数字在当前行/列/九宫格是否被放过了),2是放进去之后接着往下迭代处理剩下的部分的时候看看是否依然能解决完整个数独。所以这道题会牵涉到DFS回溯。

时间 - (9!)^9

空间O(1) - no extra space needed

Java实现

 1 class Solution {
 2     public void solveSudoku(char[][] board) {
 3         if (board == null || board.length == 0) {
 4             return;
 5         }
 6         solve(board);
 7     }
 8 
 9     public boolean solve(char[][] board) {
10         for (int i = 0; i < board.length; i++) {
11             for (int j = 0; j < board[0].length; j++) {
12                 if (board[i][j] == '.') {
13                     for (char c = '1'; c <= '9'; c++) {
14                         if (isValid(board, i, j, c)) {
15                             board[i][j] = c;
16                             if (solve(board)) {
17                                 return true;
18                             } else {
19                                 board[i][j] = '.';
20                             }
21                         }
22                     }
23                     return false;
24                 }
25             }
26         }
27         return true;
28     }
29 
30     public boolean isValid(char[][] board, int row, int col, char c) {
31         for (int i = 0; i < 9; i++) {
32             if (board[i][col] == c) {
33                 return false;
34             }
35             if (board[row][i] == c) {
36                 return false;
37             }
38             if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] != '.'
39                     && board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) {
40                 return false;
41             }
42         }
43         return true;
44     }
45 }

猜你喜欢

转载自www.cnblogs.com/aaronliu1991/p/12735614.html