• 36. Valid Sudoku


    description:

    判断数独是否正确
    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

    Each row must contain the digits 1-9 without repetition.
    Each column must contain the digits 1-9 without repetition.
    Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.
    

    Note:

    A Sudoku board (partially filled) could be valid but is not necessarily solvable.
    Only the filled cells need to be validated according to the mentioned rules.
    The given board contain only digits 1-9 and the character '.'.
    The given board size is always 9x9.
    

    Example:

    Example 1:
    
    Input:
    [
      ["5","3",".",".","7",".",".",".","."],
      ["6",".",".","1","9","5",".",".","."],
      [".","9","8",".",".",".",".","6","."],
      ["8",".",".",".","6",".",".",".","3"],
      ["4",".",".","8",".","3",".",".","1"],
      ["7",".",".",".","2",".",".",".","6"],
      [".","6",".",".",".",".","2","8","."],
      [".",".",".","4","1","9",".",".","5"],
      [".",".",".",".","8",".",".","7","9"]
    ]
    Output: true
    
    Example 2:
    
    Input:
    [
      ["8","3",".",".","7",".",".",".","."],
      ["6",".",".","1","9","5",".",".","."],
      [".","9","8",".",".",".",".","6","."],
      ["8",".",".",".","6",".",".",".","3"],
      ["4",".",".","8",".","3",".",".","1"],
      ["7",".",".",".","2",".",".",".","6"],
      [".","6",".",".",".",".","2","8","."],
      [".",".",".","4","1","9",".",".","5"],
      [".",".",".",".","8",".",".","7","9"]
    ]
    Output: false
    Explanation: Same as Example 1, except with the 5 in the top left corner being 
        modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
    
    
    

    answer:

    class Solution {
    public:
        bool isValidSudoku(vector<vector<char>>& board) {
            if (board.empty() || board[0].empty()) return false;
            vector<vector<bool>> rowFlag(9, vector<bool>(9, false));
            vector<vector<bool>> colFlag(9, vector<bool>(9, false));
            vector<vector<bool>> cellFlag(9, vector<bool>(9, false));
            for (int i = 0; i < 9; i++){
                for (int j = 0; j < 9; j++) {
                    if (board[i][j] >= '1' && board[i][j] <= '9'){
                        int c = board[i][j] - '1';
                        if (rowFlag[i][c] || colFlag[c][j] || cellFlag[3 * (i / 3) + j / 3][c]) return false;
                        rowFlag[i][c] = true;
                        colFlag[c][j] = true;
                        cellFlag[3 * (i / 3) + j / 3][c] = true; 
                        // 这里对小方块的坐标转换很关键,首先 (i/3) 是确定这个数所在的小方块所在第几行(0/1/2)
                        // 然后再乘以3是算出这个数之前几行有几个方块,在加上此列前面几个,就是算出来了这个数到底在第几个方块。
                    } 
                }
            }
            return true;
        }
    };
    

    relative point get√:

    hint :

    其实是对这个答案有疑问的:

    • 没有判断如果是个不合法的数独形式怎么办
    • 没有判断数字不是1-9内的怎么办
  • 相关阅读:
    [小技巧] micropython 如何执行 *.mpy 文件
    从零开始深入 Linux 底层(软件工程)
    从嵌套结构中取值时如何编写兜底逻辑
    学习JUC源码(2)——自定义同步组件
    学习JUC源码(1)——AQS同步队列(源码分析结合图文理解)
    Java多线程中的wait/notify通信模式
    详解Java锁的升级与对比(1)——锁的分类与细节(结合部分源码)
    认识Redis集群——Redis Cluster
    工作三年多的感慨与总结(二)
    工作三年多的感慨与总结(一)
  • 原文地址:https://www.cnblogs.com/forPrometheus-jun/p/11116372.html
Copyright © 2020-2023  润新知