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 }

 

转载于:https://www.cnblogs.com/yfs123456/p/11614958.html

要使用Python数独,可以按照以下步骤进行操作: 1. 首先,将待数独转换成Python矩阵。可以使用Python中的列表来表示数独的矩阵结构。 2. 接下来,可以使用递归的方法尝试数独。递归是一种重复调用函数自身的方法,可以用于解决数独问题。 3. 在递归函数中,可以编写代码来判断数独是否已经出。可以检查每个格子是否已经填满,并且保证每一行、每一列和每个小九宫格中的数字都不重复。 4. 如果数独出,则要使用回溯法。回溯法是一种试错的方法,当某一步操作导致数独时,要返回上一步并尝试其他可能的数字。 5. 通过递归和回溯的不断尝试,直到将数独出为止。 以下是一个示例代码的框架,可以参考来编写Python数独程序: ```python def solve_sudoku(board): if is_sudoku_solved(board): return True # 找到一个空格子 row, col = find_empty_cell(board) for num in range(1, 10): if is_valid_move(board, row, col, num): board[row][col = num if solve_sudoku(board): return True board[row][col = 0 return False def is_sudoku_solved(board): # 检查数独是否已出 pass def find_empty_cell(board): # 找到一个空格子 pass def is_valid_move(board, row, col, num): # 判断当前数字是否可以放置在指定位置 pass # 主函数 def main(): # 初始化数独矩阵 board = [ [5, 3, 0, 0, 7,0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0, 0, 0], [0, 9, 8, 0, 0, 0, 0, 6, 0], [8, 0, 0, 0, 6, 0, 0, 0, 3], [4, 0, 0, 8, 0, 3, 0, 0, 1], [7, 0, 0, 0, 2, 0, 0, 0, 6], [0, 6, 0, 0, 0, 0, 2, 8, 0], [0, 0, 0, 4, 1, 9, 0, 0, 5], [0, 0, 0, 0, 8, 0, 0, 7, 9] ] # 数独 solve_sudoku(board) # 打印出的数独矩阵 for row in board: print(row) if __name__ == '__main__': main() ``` 通过以上步骤和示例代码,可以使用Python数独问题。注意,以上代码只是一个框架,具体的实现细节要根据实际求进行修改和完善。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [6个步骤教你用Python数独!(含实例代码)](https://blog.csdn.net/weixin_41334453/article/details/102805525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值