题目:
请判定一个数独是否有效。
该数独可能只填充了部分数字,其中缺少的数字用 . 表示。
样例:
The following partially filed sudoku is valid.
思路:
- 什么是数独
Each row must have the numbers 1-9 occuring just once.Each column must have the numbers 1-9 occuring just once.
And the numbers 1-9 must occur just once in each of the 9 sub-boxes of the grid.
- 数独的合法性
只要当前已经填充的数字是合法的就可以,不一定要这个数独是有解的。 - 所以,本题的思路就是使矩阵的每一行已有的数字不重复,每一列已有的数字不重复,每一个小九宫格的数字不重复。每次一个set来存储数字出现的状态。
参考答案:
class Solution {
public:
/*
* @param board: the board
* @return: whether the Sudoku is valid
*/
bool isValidSudoku(vector<vector<char>> &board) {
// write your code here
if(board.empty()) return false;
for(int i=0; i<9; i++){//检查每一行
map<char,bool> row; //未初始化的bool值是false
for(int j=0; j<9; j++){
if(board[i][j] != '.'){ //遇到‘.’就忽略掉
if(row[board[i][j]] == true){
return false;
}
else{
row[board[i][j]] = true;
}
}
}
}
for(int i=0; i<9; i++){//检测每一列
map<char,bool> col;
for(int j=0; j<9; j++){
if(board[j][i] != '.'){
if(col[board[j][i]] == true){
return false;
}
else{
col[board[j][i]] = true;
}
}
}
}
for(int i=0; i<9; i+=3){
for(int j=0; j<9; j+=3){//检查每一个小块
map<char, bool> block;
for(int k=0; k<9; k++){
if(board[i+k/3][j+k%3] != '.'){
if(block[board[i+k/3][j+k%3]] == true){
return false;
}
else{
block[board[i+k/3][j+k%3]] = true;
}
}
}
}
}
return true;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。