LeetCode-36 有效的数独

简介: LeetCode-36 有效的数独

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/valid-sudoku

题目描述

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

 

注意:

一个有效的数独(部分已被填充)不一定是可解的。

只需要根据以上规则,验证已经填入的数字是否有效即可。

空白格用 '.' 表示。

 

示例 1:

 

 

输入:board =

[["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"]]

输出:true

示例 2:

输入:board =

[["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"]]

输出:false

解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

 

提示:

board.length == 9

board[i].length == 9

board[i][j] 是一位数字(1-9)或者 '.'

解题思路

本题仅需要确定已经填入的数字是否符合规则,不需要判断数独是否有解,很大的降低了解题难度。

利用状态压缩的策略,每行的情况可以使用一个int来记录,其中0-8位分别代表该行1-9是否出现过,如果出现则直接可以判定这个数独不符合规则,同样每列和每个格子都可以使用这种思路。

代码展示

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        vector<int> Row(9, 0), Col(9, 0);
        vector<vector<int>> Block(3, vector<int>(3, 0));
        for(int i = 0; i < 9; i++)
            for(int j = 0; j < 9; j++)
            {
                if(board[i][j] != '.')
                {
                    int c = board[i][j] - '1';
                    if(Row[i] & 1 << c)
                        return false;
                    if(Col[j] & 1 << c)
                        return false;
                    if(Block[i / 3][j / 3] & 1 << c)
                        return false;
                    Row[i] |= 1 << c;
                    Col[j] |= 1 << c;
                    Block[i / 3][j / 3] |= 1 << c;
                }
            }
        return true;
    }
};

运行结果

 


相关文章
|
4月前
|
Java
leetcode-37:解数独
leetcode-37:解数独
22 0
|
7月前
|
测试技术
代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
22 1
|
4月前
leetcode-36:有效的数独
leetcode-36:有效的数独
24 0
|
4月前
|
机器学习/深度学习
leetcode-52:N皇后 II
leetcode-52:N皇后 II
15 0
|
9月前
|
算法
LeetCode-37 解数独
LeetCode-37 解数独
|
11月前
|
算法 安全 Swift
LeetCode - #36 有效的数独
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #36 有效的数独
|
11月前
|
算法 安全 Swift
LeetCode - #37 解数独
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #37 解数独
|
11月前
|
机器学习/深度学习 算法 安全
LeetCode - #52 N皇后 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #52 N皇后 II
|
11月前
leetcode:36.有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
68 0

热门文章

最新文章