美文网首页
36. 有效的数独

36. 有效的数独

作者: 薄荷糖的味道_fb40 | 来源:发表于2019-04-22 19:45 被阅读0次

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

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

    上图是一个部分填充的有效的数独。

    数独部分空格内已填入了数字,空白格用 '.' 表示。

    示例 1:

    输入:
    [
    ["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:

    输入:
    [
    ["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 存在, 因此这个数独是无效的。</pre>

    说明:

    • 一个有效的数独(部分已被填充)不一定是可解的。
    • 只需要根据以上规则,验证已经填入的数字是否有效即可。
    • 给定数独序列只包含数字 1-9 和字符 '.'
    • 给定数独永远是 9x9 形式的。

    思路:

    用哈希表统计每行,每列,每个3*3方块内是否出现数字,如果发现重复则返回false,不重复返回true,具体实现如下。

    class Solution {
    public:
    
        bool isValidSudoku(vector<vector<char>>& board) {
                const int size=9;
            bool row_mask[size][size];
            bool col_mask[size][size];
            bool area_mask[size][size];
            memset(row_mask,false,sizeof(row_mask));
            memset(col_mask,false,sizeof(col_mask));
            memset(area_mask,false,sizeof(area_mask));
            for(int i=0;i<size;i++)
            {
                for(int j=0;j<size;j++)
                {
                    if(!isdigit(board[i][j]))
                    {
                        continue;
                    }
                    int num=board[i][j]-'0'-1;
                    int area=(i/3)*3+(j/3);
                    if(row_mask[i][num] || col_mask[j][num]|| area_mask[area][num])
                    {
                        return false;
                    }
                    row_mask[i][num]=col_mask[j][num]=area_mask[area][num]=true;
                }
                
            }
            return true;
        }
    };
    

    相关文章

      网友评论

          本文标题:36. 有效的数独

          本文链接:https://www.haomeiwen.com/subject/zegugqtx.html