LeetCode-37.解数独

Posted lyh28

tags:

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

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

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

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

  空白格用 ‘.‘ 表示。

  Note:

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

 

  做题的时候,思路有了,但是代码小问题比较多,改了也挺久。

 

 1 class Solution {
 2     public void solveSudoku(char[][] board) {
 3         solveSudoku(board,0,0);
 4     }
 5     public boolean solveSudoku(char[][] board,int i,int j) {
 6         for(int ii=0;ii<9;ii++)
 7             for(int jj=0;jj<9;jj++){
 8                 if(ii<i&&jj<j)
 9                     continue;
10                 //找出需要填写的空格
11                 if(board[ii][jj]==‘.‘){
12                     //从1到10逐个填入测试
13                     for(int n=1;n<10;n++){
14                         board[ii][jj]=(char)(n+48);
15                         //若该数字满足数独规则时,返回true
16                         if(checki(board,ii,jj)&&checkj(board,ii,jj)&&checkij(board,ii,jj)
17                            &&solveSudoku(board,ii+(jj+1)/9,(jj+1)%9))  return true;
18                     }
19                     //若全都不满足时,填回‘.‘‘
20                     board[ii][jj]=‘.‘;
21                     return false;
22                 }
23             }
24         return true;
25     }
26     //检查横
27     private boolean checki(char[][] b,int i,int j){
28         char tmp=b[i][j];
29         for(int n=0;n<9;n++){
30             if(b[i][n]==tmp&&n!=j)
31                 return false;
32         }   
33         return true;
34     }
35     //检查竖
36     private boolean checkj(char[][] b,int i,int j){
37         char tmp=b[i][j];
38         for(int n=0;n<9;n++){
39             if(b[n][j]==tmp&&n!=i)
40                 return false;
41         }   
42         return true;
43     }
44     //检查方格
45     private boolean checkij(char[][] b,int i,int j){
46         char tmp=b[i][j];
47         int m=(i/3)*3;
48         int n=(j/3)*3;
49         for(int mm=m;mm<m+3;mm++){
50             for(int nn=n;nn<n+3;nn++){
51                 if(b[mm][nn]==tmp&&i!=mm&&j!=nn)
52                 return false;
53             }
54         }   
55         return true;
56     }
57 }

 

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

LeetCode-37.解数独

算法leetcode|37. 解数独(rust重拳出击)

LeetCode 37. Sudoku Solver —— 解数独

leetcode 37解数独

Python描述 LeetCode 37. 解数独

LeetCode——37. 解数独