码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】Valid Sudoku

时间:2014-12-17 23:55:15      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   io   color   sp   for   strong   

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 ‘.‘.

bubuko.com,布布扣

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;
    }
};

bubuko.com,布布扣

i%3*3+j%3

【LeetCode】Valid Sudoku

标签:style   blog   http   ar   io   color   sp   for   strong   

原文地址:http://www.cnblogs.com/ganganloveu/p/4170632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!