请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
注意:
输入:board =
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:true
输入:board =
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:false
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字(1-9
)或者 '.'
暴力穷举遍历即可。
class Solution
{
public:
bool isValidSudoku(vector<vector<char>>& board)
{
vector<int> rowVisited(10, 0);
vector<int> columnVisited(10, 0);
vector<int> palaceVisited(10, 0);
int curIndex = 0;
bool status = true;
char rowChar;
char columnChar;
//行 列
while(curIndex < 9)
{
for(int i = 0;i < 9;i++)
{
rowChar = board[curIndex][i];
columnChar = board[i][curIndex];
if('.' != rowChar)
{
if(1 == rowVisited[rowChar - 48])
{
status = false;
break;
}
rowVisited[rowChar - 48]++;
}
if('.' != columnChar)
{
if(1 == columnVisited[columnChar - 48])
{
status = false;
break;
}
columnVisited[columnChar - 48]++;
}
}
if(!status)
{
return false;
}
curIndex++;
for(int i = 0;i < 10;i++)
{
rowVisited[i] = 0;
columnVisited[i] = 0;
}
}
//3 x 3宫内
for(int i = 0;i < 9;i += 3)
{
for(int j = 0;j < 9;j += 3)
{
for(int w = 0;w < 10;w++)
{
palaceVisited[w] = 0;
}
for(int k = i;k < i + 3;k++)
{
for(int z = j;z < j + 3;z++)
{
if('.' != board[k][z])
{
if(1 == palaceVisited[board[k][z] - 48])
{
status = false;
break;
}
palaceVisited[board[k][z] - 48]++;
}
}
if(!status)
{
break;
}
}
if(!status)
{
break;
}
}
if(!status)
{
break;
}
}
return status;
}
};
优化方式一,将3x3宫内判断与行列判断一起,只需通过 j/3 + (i/3)*3区分不同的宫格即可。
具体可参考:
作者:liujin-4
链接:https://leetcode.cn/problems/valid-sudoku/solution/36-jiu-an-zhao-cong-zuo-wang-you-cong-shang-wang-x/
class Solution
{
public:
bool isValidSudoku(vector<vector<char>>& board)
{
vector<int> rowVisited(10, 0);
vector<int> columnVisited(10, 0);
vector<vector<int>> palaceVisited(10, vector<int>(10, 0));
int curIndex = 0;
bool status = true;
char rowChar;
char columnChar;
while(curIndex < 9)
{
for(int i = 0;i < 9;i++)
{
//行 列
rowChar = board[curIndex][i];
columnChar = board[i][curIndex];
if('.' != rowChar)
{
if(1 == rowVisited[rowChar - 48])
{
status = false;
break;
}
rowVisited[rowChar - 48]++;
// 3 x 3宫内
if(palaceVisited[i / 3 + (curIndex /3) * 3][rowChar - 48])
{
status = false;
break;
}
palaceVisited[i / 3 + (curIndex /3) * 3][rowChar - 48]++;
}
if('.' != columnChar)
{
if(1 == columnVisited[columnChar - 48])
{
status = false;
break;
}
columnVisited[columnChar - 48]++;
}
}
if(!status)
{
break;
}
curIndex++;
for(int i = 0;i < 10;i++)
{
rowVisited[i] = 0;
columnVisited[i] = 0;
}
}
return status;
}
};