一、 题目
数独游戏,每一行,每一列,每一个小方格中含有数字1-9且不重复,不要求数字全部出现,可以用’.’代替。判断给出方格的是否符合要求。
二、 分析
第一次玩这个游戏,不知道规则,搜之,原来就是要遍历判断,那就查询每一行,每一列,每一个方格啦!主要的技巧是在判断方格时,可以使用一个四重for循环,优化后使用一个三重循环。
class Solution {
public:
bool isValidSudoku(vector<vector<char> > &board) {
int map[9];
//检查行
for(int i = 0; i < 9; i++){
memset(map,0,sizeof(int)*9);
for(int j = 0; j < 9; j++){
if(board[i][j] != '.')
if(map[board[i][j] -'1'] == 1)
return false;
else
map[board[i][j] - '1'] = 1;
}
}
//检查列
for(int i = 0; i < 9; i++){
memset(map,0,sizeof(int)*9);
for(int j = 0; j < 9; j++){
if(board[j][i] != '.')
if(map[board[j][i] -'1'] == 1)
return false;
else
map[board[j][i] - '1'] = 1;
}
}
//检查9个方格
for(int i = 0; i < 3; i ++){
for(int n = 0; n < 3; n++){
memset(map, 0, sizeof(int)*9);
for(int j = i*3; j < 3 + i*3; j ++){
for(int k = n*3; k < 3 + n*3; k++){
if(board[j][k] != '.'){
if(map[board[j][k] - '1'] == 1)
return false;
else
map[board[j][k] - '1'] = 1;
}
}
}
}
}
/*或
for(int i = 0; i < 9; i ++){
memset(map, 0, sizeof(int)*9);
for(int j = i/3*3; j < 3 + i/3*3; j ++){
for(int k = i%3*3; k < 3 + i%3*3; k++){
if(board[j][k] != '.'){
if(map[board[j][k] - '1'] == 1)
return false;
else
map[board[j][k] - '1'] = 1;
}
}
}
}
*/
return true;
}
};