首页 > 代码库 > 【LeetCode】Valid Sudoku

【LeetCode】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 ++)        {            map<char, bool> m1;  //check i_th row            map<char, bool> m2;  //check i_th col            map<char, bool> m3;  //check i_th sub-boxes            for(int j = 0; j < 9; j ++)            {                //i_th row, j_th col                if(board[i][j] != .)                {                    if(m1.find(board[i][j]) != m1.end())                        return false;                    else                        m1[board[i][j]] = true;                }                                //i_th col, j_th row                if(board[j][i] != .)                {                    if(m2.find(board[j][i]) != m2.end())                        return false;                    else                        m2[board[j][i]] = true;                }                                //i_th sub-boxes, j_th grid                if(board[i/3*3+j/3][i%3*3+j%3] != .)                {                    if(m3.find(board[i/3*3+j/3][i%3*3+j%3]) != m3.end())                        return false;                    else                        m3[board[i/3*3+j/3][i%3*3+j%3]] = true;                }            }        }        return true;    }};

i%3*3+j%3

【LeetCode】Valid Sudoku