zoukankan      html  css  js  c++  java
  • 解数独

    问题描述

    1. leetcode36  判断数独是否有效的升级版,给定一个未被完成的数独,要求完成。同样包含 3 个要求。
    2. 数字 1-9 在每一行只能出现一次

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

    解题思路

    1. 首先将每行每列、3X3宫内已经出现的元素保存起来;
    2. 从位置 [0][0] 开始深度搜索。

    Java 解法

     1 public class Solution {
     2     // 利用数组判断数字是否重复,true 代表重复
     3     // row[7][1] 代表第 7+1 = 8 行 的字符 1 + 1 = 2 已经使用过了
     4     boolean[][] row = new boolean[9][9];
     5     // col[7][2] = true 代表第 7 + 1 = 8 列的字符 2 + 1 = 3 已经使用过了
     6     boolean[][] col = new boolean[9][9];
     7     boolean[][][] cell = new boolean[3][3][9];
     8 
     9     public void solveSudoku(char[][] board) {
    10         for (int i = 0; i < 9; i ++) {
    11             for (int j = 0; j < 9; j ++) {
    12                 char c = board[i][j];
    13                 if (c != '.') {
    14                     int k = c - '1';
    15                     row[i][k] = true;
    16                     col[j][k] = true;
    17                     cell[i/3][j/3][k] = true;
    18                 }
    19             }
    20         }
    21 
    22         dfs(board, 0, 0);
    23     }
    24 
    25     /**
    26      *
    27      * @param board 棋盘
    28      * @param i 当前行
    29      * @param j 当前列
    30      * @return  是否可以继续填充
    31      */
    32     private boolean dfs(char[][] board, int i, int j) {
    33         if (j == 9) {
    34             i ++;
    35             j = 0;
    36         }
    37         if (i == 9) return true;
    38 
    39         if (board[i][j] != '.') return dfs(board, i, j + 1);
    40 
    41         for (int k = 0; k < 9; k ++) {
    42             if (!row[i][k] && !col[j][k] && !cell[i/3][j/3][k]) {
    43                 board[i][j] = (char)('1' + k);
    44 
    45                 row[i][k] = true;
    46                 col[j][k] = true;
    47                 cell[i/3][j/3][k] = true;
    48 
    49                 if (dfs(board, i, j + 1)) {
    50                     return true;
    51                 }
    52                 // 回溯后恢复现场
    53                 row[i][k] = false;
    54                 col[j][k] = false;
    55                 cell[i/3][j/3][k] = false;
    56                 board[i][j] = '.';
    57             }
    58         }
    59         return false;
    60     }
    61 }
  • 相关阅读:
    c#中使用多线程访问winform中控件的若干问题(转)
    Winform 分页控件(转)
    C#争论:什么时候应该使用var?
    C#的Contains() 值还是引用
    DataTemplate
    DX11_基于GPU_ComputeShader的3D精确拾取
    串行的BitonicSort双调排序
    Directx11_使用Effect框架包装ComputeShader
    Silverlight自适应布局
    poj3626广搜
  • 原文地址:https://www.cnblogs.com/dogeLife/p/11019318.html
Copyright © 2011-2022 走看看