leetcode No36. Valid Sudoku

来源:互联网 发布:玫瑰花淘宝 编辑:程序博客网 时间:2024/05/29 09:11

Question:

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.

判断数独是否合法,即每行,每列,每个子九宫格是没有重复的数

Algorithm:

两层循环,行和列比较好判断
那么子九宫格,我们来找一下规律
每一层循环要判断一个九宫格,我们给每个九宫格编号,第一行从左到右0~2,第二行从左到右3~5,第三行从左到右6~8
0号九宫格行号000111222    列号012012012i=0,j(0~8)
1号九宫格行号000111222    列号345345345i=1,j(0~8)
2号九宫格行号000111222    列号678678678 i=2,j(0~8)
3号九宫格行号333444555    列号012012012i=3,j(0~8)
4号九宫格行号333444555    列号345345345i=4,j(0~8)
5号九宫格行号333444555    列号678678678i=5,j(0~8)
6号九宫格行号666777888    列号012012012 i=6,j(0~8)
7号九宫格行号666777888    列号345345345i=7,j(0~8)
8号九宫格行号666777888    列号678678678i=8,j(0~8)
可以发现行号的规律i/3*3+j/3,列号的规律i%3*3+j%3

Accepted Code:

class Solution {//检查数独是否合法public:    bool isValidSudoku(vector<vector<char>>& board) {        int N=board.size();        for(int i=0;i<N;i++)        {            unordered_map<char,bool> hash1;   //row            unordered_map<char,bool> hash2;   //column             unordered_map<char,bool> hash3;   //subgrid            for(int j=0;j<N;j++)            {                if(board[i][j]!='.')                {                    if(hash1[board[i][j]]==true)                        return false;                    hash1[board[i][j]]=true;                }                if(board[j][i]!='.')                {                    if(hash2[board[j][i]]==true)                        return false;                    hash2[board[j][i]]=true;                }                if(board[(i/3)*3+j/3][(i%3)*3+j%3]!='.')                {                    if(hash3[board[(i/3)*3+j/3][(i%3)*3+j%3]]==true)                        return false;                    hash3[board[(i/3)*3+j/3][(i%3)*3+j%3]]=true;                }            }                    }        return true;    }};



0 0
原创粉丝点击