码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode-37.解数独

时间:2019-03-31 20:49:47      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:div   返回   空白   序列   check   int   通过   表示   需要   

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

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

  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.解数独

标签:div   返回   空白   序列   check   int   通过   表示   需要   

原文地址:https://www.cnblogs.com/lyh28/p/10632964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!