判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
简单的三次遍历:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
if(board.size()<=0) {
return false;
}
unordered_map<char,int> check;
// 检查每一行
for (int i = 0; i < board.size(); i++)
{
for (int j = 0; j < board[0].size(); j++)
{
if(board[i][j]!='.') {
auto iter=check.find(board[i][j]);
if(iter==check.end()) {
check[board[i][j]]=1;
} else {
return false;
}
}
}
check.clear();
}
// 检查每一列
for (int i = 0; i < board[0].size(); i++)
{
for (int j = 0; j < board.size(); j++)
{
if(board[j][i]!='.') {
auto iter=check.find(board[j][i]);
if(iter==check.end()) {
check[board[j][i]]=1;
} else {
return false;
}
}
}
check.clear();
}
// 检查每个小正方形
for (int i = 0; i < board[0].size()/3; i++)
{
for (int j = 0; j < board.size()/3; j++)
{
for (int k = 0; k < 3; k++)
{
for (int m = 0; m < 3; m++)
{
if(board[i*3+k][j*3+m]!='.') {
auto iter=check.find(board[i*3+k][j*3+m]);
if(iter==check.end()) {
check[board[i*3+k][j*3+m]]=1;
} else {
return false;
}
}
}
}
check.clear();
}
}
return true;
}
};
优化为只需一次遍历:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
if(board.size()<=0) {
return false;
}
vector<vector<bool>> rows(9,vector<bool>(9,false));
vector<vector<bool>> cols(9,vector<bool>(9,false));
vector<vector<bool>> subBox(9,vector<bool>(9,false));
for (int i = 0; i < board.size(); i++)
{
for (int j = 0; j < board[0].size(); j++)
{
if(board[i][j]!='.') {
int num = board[i][j]-'1';
if(rows[i][num]) {
return false;
} else {
rows[i][num] = true;
}
if(cols[j][num]) {
return false;
} else {
cols[j][num] = true;
}
if(subBox[i/3+(j/3)*3][num]) {
return false;
} else {
subBox[i/3+(j/3)*3][num]=true;
}
}
}
}
return true;
}
};
来源:CSDN
作者:wenkun97
链接:https://blog.csdn.net/hello_my_coder/article/details/104611165