单纯的行和列的判断较为简单,对于每一个元素如果是数字的话就将其对应的数组下标的元素变为1(是特殊符号的话就继续读取下一个元素),对于之后的数字,就会将其与0进行对比,如果其不为0的话,那么这个元素一定出现过了,则可以直接退出。对于小方块可以发现,一个9 * 9的矩阵里面有3 * 3个小矩阵,因此我们可以使用四个for循环进行小方块的遍历,需要注意的是内部的循环变量与外部的循环变量相关,而每一个小方块之间差距是 3 个小矩形,因此终止条件需要加3。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
// 检测每一行
for(int i = 0;i < 9;++i)
{
int tmp[9] = {0};
for(int j = 0;j < 9;++j)
{
// 碰到非数字就直接跳过
if(board[i][j] == '.')
continue;
// 把数组中的字符转为数字,如果这个数字不是1,说明出现过了
if(tmp[board[i][j] - '1'] != 0)
return false;
// 将当前字符转为数字然后将该位置置为1
tmp[board[i][j] - '1'] = 1;
}
}
// 检测每一列,与上面方法一样只需要更改循环的方式
for(int i = 0;i < 9;++i)
{
int tmp[9] = {0};
for(int j = 0;j < 9;++j)
{
// 碰到非数字就直接跳过
if(board[j][i] == '.')
continue;
// 把数组中的字符转为数字,如果这个数字不是1,说明出现过了
if(tmp[board[j][i] - '1'] != 0)
return false;
// 将当前字符转为数字然后将该位置置为1
tmp[board[j][i] - '1'] = 1;
}
}
// 检查每一个小方块,一行三个,一列也是三个,因此外层循环可以终点设置为3
// 内层循环合理利用3进行操作
for(int i = 0;i < 3;++i)
{
for(int j = 0;j < 3;++j)
{
int tmp[9] = {0};
// 下面的循环相当于内部循环
for(int ii = i * 3;ii < i * 3 + 3;++ii)
{
for(int jj = j * 3;jj < j * 3 + 3;++jj)
{
// 碰到非数字就直接跳过
if(board[ii][jj] == '.')
continue;
// 把数组中的字符转为数字,如果这个数字不是1,说明出现过了
if(tmp[board[ii][jj] - '1'] != 0)
return false;
// 将当前字符转为数字然后将该位置置为1
tmp[board[ii][jj] - '1'] = 1;
}
}
}
}
return true;
}
};
该代码段展示了一个C++函数,用于检查9x9的数独板是否有效。它通过遍历行、列和每个3x3的小宫格,检查每个数字1到9是否只出现一次,遇到非数字字符则跳过。若在遍历过程中发现重复数字,则立即返回false,表示无效;否则,如果所有检查都通过,返回true,表示数独有效。
2494

被折叠的 条评论
为什么被折叠?



