zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    如何用ASP.NET加密Cookie数据过程分析
    PHP监控linux服务器负载情况分析解决方案
    我发现了博客的一个小问题
    人生总是有太多的失望
    小公司根据实据情况部署实施Linux集群网站
    刚刚收到光棍短信祝福了!
    我对你的期望有点过了
    PHP在接下来的几年内将是主主流的
    不付出一定不会有收获!
    关于创建RootDesigner的文章
  • 原文地址:https://www.cnblogs.com/yfs123456/p/11614958.html
Copyright © 2011-2022 走看看