zoukankan      html  css  js  c++  java
  • 37.Sudoku Solver

    题目链接:https://leetcode.com/problems/sudoku-solver/description/

    题目大意:数独。要求:每行每列、每个小3*3方块都是1-9的数,且不重复。

    解法一:深搜。要注意细节:java传数组是地址,不是传值,每一次的改变都是在原数组上进行的。代码如下(15ms):

     1     public static void main(String[] args) {
     2         char[][] board = {
     3                 {'5', '3', '.', '.', '7', '.', '.', '.', '.'},
     4                 {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
     5                 {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
     6                 {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
     7                 {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
     8                 {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
     9                 {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
    10                 {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
    11                 {'.', '.', '.', '.', '8', '.', '.', '7', '9'},
    12         };
    13         new Main().solveSudoku(board);
    14     }
    15 
    16     private static boolean flag = false;
    17     public void solveSudoku(char[][] board) {
    18         flag = false;//必须重置,因为flag这里作为全局变量存在,不重置的话,会导致下一个测试用例开始时flag的值就是true
    19         dfs(0, 0, board);
    20 /*        for(int i = 0; i < 9; i++) {
    21             for(int j = 0; j < 9; j++) {
    22                 System.out.print(board[i][j] + " ");
    23             }
    24             System.out.println();
    25         }*/
    26     }
    27     public static void dfs(int x, int y, char[][] board) {
    28         if(flag == true) {
    29             return;
    30         }
    31         if(x == 9 && y == 0) {//找到第十行第一个数时,表示数独结束
    32             flag = true;
    33             return;
    34         }
    35         if(y == 9) {//查找下一行第一个数
    36             dfs(x + 1, 0, board);
    37         }
    38         else if(board[x][y] != '.') {//查找下一个数
    39             dfs(x, y + 1, board);
    40         }
    41         else if(board[x][y] == '.') {
    42             for(int i = 1; i <= 9; i++) {
    43                 if(check(x, y, (char)(i + '0'), board) == true) {
    44                     board[x][y] = (char)(i + '0');
    45                     dfs(x, y + 1, board);
    46                     if(flag == true) {//一旦找到一个结果就返回,不再回溯,否则会导致最后的数组,回溯回最原始的状态。且记住:java中数组作为参数是传地址
    47                         return;
    48                     }
    49                     board[x][y] = '.';
    50                 }
    51             }
    52         }
    53     }
    54     public static boolean check(int x, int y, int value, char[][] board2) {
    55         for(int i = 0; i < 9; i++) {
    56             if(board2[x][i] == value) {//检验行
    57                 return false;
    58             }
    59             if(board2[i][y] == value) {//检验列
    60                 return false;
    61             }
    62         }
    63         x = x / 3 * 3;
    64         y = y / 3 * 3;
    65         for(int i = x; i < x + 3; i++) {//检验每个3*3方格
    66             for(int j = y; j < y + 3; j++) {
    67                 if(board2[i][j] == value) {
    68                     return false;
    69                 }
    70             }
    71         }
    72         return true;
    73     }
    View Code
  • 相关阅读:
    java
    java
    java
    js
    java
    异常之异常处理
    面向对象之元类
    面向对象之内置方法
    面向对象之反射
    面向对象之类方法与静态方法
  • 原文地址:https://www.cnblogs.com/cing/p/8268954.html
Copyright © 2011-2022 走看看