zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    怎么安装Python?
    Ramnit蠕虫病毒分析和查杀
    Exphub[漏洞利用脚本库]
    SMBv3远程代码执行漏洞复现(CVE-2020-0796)
    Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)
    Fastjson远程代码执行漏洞复现
    信息收集之——旁站、C段
    Redis未授权访问漏洞复现与利用
    CSS
    MVC控制器路由
  • 原文地址:https://www.cnblogs.com/lyh28/p/10632964.html
Copyright © 2011-2022 走看看