• 【LeetCode】36. Valid Sudoku


    Valid Sudoku

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

    The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

    A partially filled sudoku which is valid.

    Note:
    A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

    依次检查每行,每列,每个子九宫格是否出现重复元素,如果出现返回false,否则返回true.

    难点在于表示第i个九宫格每个格点的坐标。

    观察行号规律:

    第0个九宫格:000111222; 第1个九宫格:000111222; 第2个九宫格:000111222;

    第3个九宫格:333444555; 第4个九宫格:333444555; 第5个九宫格:333444555;

    第6个九宫格:666777888; 第7个九宫格:666777888; 第8个九宫格:666777888;

    可见对于每三个九宫格行号增3;对于单个九宫格,每三个格点行号增1。

    因此第i个九宫格的第j个格点的行号可表示为i/3*3+j/3

    观察列号规律:

    第0个九宫格:012012012; 第1个九宫格:345345345; 第2个九宫格:678678678;

    第3个九宫格:012012012; 第4个九宫格:345345345; 第5个九宫格:678678678;

    第6个九宫格:012012012; 第7个九宫格:345345345; 第8个九宫格:678678678;

    可见对于下个九宫格列号增3,循环周期为3;对于单个九宫格,每个格点行号增1,周期也为3。

    周期的数学表示就是取模运算mod。

    因此第i个九宫格的第j个格点的列号可表示为i%3*3+j%3

    class Solution {
    public:
        bool isValidSudoku(vector<vector<char> > &board) {
            for(int i = 0; i < 9; i ++)
            {
                unordered_map<char, bool> m1;   //check i_th row
                unordered_map<char, bool> m2;   //check i_th column
                unordered_map<char, bool> m3;   //check i_th subgrid
                for(int j = 0; j < 9; j ++)
                {
                    if(board[i][j] != '.')
                    {
                        if(m1[board[i][j]] == true)
                            return false;
                        m1[board[i][j]] = true;
                    }
                    if(board[j][i] != '.')
                    {
                        if(m2[board[j][i]] == true)
                            return false;
                        m2[board[j][i]] = true;
                    }
                    if(board[i/3*3+j/3][i%3*3+j%3] != '.')
                    {
                        if(m3[board[i/3*3+j/3][i%3*3+j%3]] == true)
                            return false;
                        m3[board[i/3*3+j/3][i%3*3+j%3]] = true;
                    }
                }
            }
            return true;
        }
    };

  • 相关阅读:
    sql注入漏洞详解
    HTTP1.0/1.1/2.0的区别
    http协议详解
    LRU经典算法的原理与实现
    [译转]深入理解LayoutInflater.inflate()
    Touch事件分发机制
    重要:Android绘图只Mask遮罩
    Android View学习Tips
    ViewPager学习及使用(一)
    Android 实现瀑布流的两种思路
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4170632.html
Copyright © 2020-2023  润新知