37. 解数独

Posted yfs123456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37. 解数独相关的知识,希望对你有一定的参考价值。

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.‘ 表示。

 技术图片

一个数独。

 技术图片

答案被标成红色。

Note:

给定的数独序列只包含数字 1-9 和字符 ‘.‘ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 1 public class Solution 
 2     private boolean[][] row = null;
 3     private boolean[][] col = null;
 4     private boolean[][][] palace = null;
 5 
 6     // cur表示行
 7     private boolean helper(char[][] board, int i, int j)
 8         // i行j列
 9         for (int k = 1; k < 10; k++) 
10             if (!row[i][k] && !col[j][k] && !palace[i/3][j/3][k]) 
11                 board[i][j] = (char)(k+‘0‘);
12                 row[i][k] = true;
13                 col[j][k] = true;
14                 palace[i/3][j/3][k] = true;
15                 int ii=i,jj=j;
16                 while (board[ii][jj] != ‘.‘) 
17                     if (jj < 8) 
18                         jj = jj + 1;
19                      else if (jj == 8) 
20                         ii = ii + 1;
21                         jj = 0;
22                     
23                     if (ii == 9) 
24                         return true;
25                     
26                 
27                 if(helper(board,ii,jj))
28                     return true;
29                 board[i][j] = ‘.‘;
30                 row[i][k] = false;
31                 col[j][k] = false;
32                 palace[i/3][j/3][k] = false;
33             
34         
35         return false;
36     
37 
38     public void solveSudoku(char[][] board) 
39         row = new boolean[9][9+1];
40         col = new boolean[9][9+1];
41         palace = new boolean[3][3][9+1];
42         int ii = -1,jj = -1;
43         for (int i = 0; i < 9; i++) 
44             for (int j = 0; j < 9; j++) 
45                 char elem = board[i][j];
46                 if (elem == ‘.‘) 
47                     if (ii == -1 && jj == -1)
48                         ii = i;
49                         jj = j;
50                     
51                     continue;
52                 
53                 row[i][elem-‘0‘] = true;
54                 col[j][elem-‘0‘] = true;
55                 palace[i/3][j/3][elem-‘0‘] = true;
56             
57         
58         helper(board,ii,jj);
59     
60 
61     private void print(char[][] board) 
62         for (int i = 0; i < 9; i++) 
63             for (int j = 0; j < 9; j++) 
64                 System.out.print(board[i][j]+" ");
65             
66             System.out.println();
67         
68     
69 
70     public static void main(String[] args) 
71         char[][] board = 
72                 ‘5‘,‘3‘,‘.‘,‘.‘,‘7‘,‘.‘,‘.‘,‘.‘,‘.‘,
73                 ‘6‘,‘.‘,‘.‘,‘1‘,‘9‘,‘5‘,‘.‘,‘.‘,‘.‘,
74                 ‘.‘,‘9‘,‘8‘,‘.‘,‘.‘,‘.‘,‘.‘,‘6‘,‘.‘,
75                 ‘8‘,‘.‘,‘.‘,‘.‘,‘6‘,‘.‘,‘.‘,‘.‘,‘3‘,
76                 ‘4‘,‘.‘,‘.‘,‘8‘,‘.‘,‘3‘,‘.‘,‘.‘,‘1‘,
77                 ‘7‘,‘.‘,‘.‘,‘.‘,‘2‘,‘.‘,‘.‘,‘.‘,‘6‘,
78                 ‘.‘,‘6‘,‘.‘,‘.‘,‘.‘,‘.‘,‘2‘,‘8‘,‘.‘,
79                 ‘.‘,‘.‘,‘.‘,‘4‘,‘1‘,‘9‘,‘.‘,‘.‘,‘5‘,
80                 ‘.‘,‘.‘,‘.‘,‘.‘,‘8‘,‘.‘,‘.‘,‘7‘,‘9‘
81         ;
82         new Solution().solveSudoku(board);
83     
84 

 

以上是关于37. 解数独的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 37.解数独

Leetcode No.37 解数独(回溯)

Leetcode No.37 解数独(回溯)

leetcode 37解数独

LeetCode-37.解数独

Backtracking_37. 解数独