今天在力扣上做题,关于检查数独是否正确那题,输出结果和预期结果一直不对
class Solution {
public:
bool isValidSudoku(vectorchar>>& board) {
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
if(board[i][j] != '.'){
char now = board[i][j];
int count=0;
//1.数字 1-9 在每一行只能出现一次
// 2.数字 1-9 在每一列只能出现一次
for(int k=1;k<9;k++){
if(board[i][k] == now || board[k][j] == now){
count++;
if(count ==3)
{return 0;}
}
}
//3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
count=0; //计数器
int r = i/3;//获得大格子所在行
int c = j/3;//获得大格子所在列
char b[9] = {board[r][c],board[r][c+1],board[r][c+2],
board[r+1][c],board[r+1][c+1],board[r+1][c+2],
board[r+2][c],board[r+2][c+1],board[r+2][c+2]};//获得大格子内的所有数
for(int k=0;k<9;k++){//遍历上面的数组
if(b[k] == now){//如果遍历的这个数和当前的数相等
count++;//计数器+1 (遍历必然会遍历本身的数)
if(count == 2){//如果这个数在格子内出现两次 ,即出现重复数
return 0;//数独不合格
}
}
}
}
}
}
return 1;
}
};
示例给的是true;
运行结果一直是false
试过把3.后面的代码删掉,示例的运行结果是true,说明前两条没问题,是第三条有问题;
也试过把计数器判定的2次改成3次,也能运行出来true
不明白3.是哪个地方出现了问题,可能是我忽视了某些基础问题,求指导!
兄弟,你的代码问题在于
1)对3*3九宫格进行偏移计算的时候错了
int r = i/3;//获得大格子所在行
这里应该再加上
r *= 3;
int c = j/3;//获得大格子所在列
这里应该再加上
c *= 3
char b[9] = {board[r][c],board[r][c+1],board[r][c+2],
board[r+1][c],board[r+1][c+1],board[r+1][c+2],
board[r+2][c],board[r+2][c+1],board[r+2][c+2]};//获得大格子内的所有数
2)检查行列的不要放到一起,如果同一个循环中行列都有重复你这个只能算到1个;另外这个循环应该也是从k=0开始啊
兄弟你的代码风格看起来也有点凌乱,可以关注下我的专栏,后面一起学习交流
以下是基于你的代码修改后提交通过的代码
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
if(board[i][j] != '.'){
char now = board[i][j];
int count=0;
//1.数字 1-9 在每一行只能出现一次
// 2.数字 1-9 在每一列只能出现一次
for(int k=0;k<9;k++){
if(board[i][k] == now){
count++;
if(count ==2)
{
return 0;
}
}
}
count = 0;
for(int k=0;k<9;k++){
if(board[k][j] == now){
count++;
if(count ==2)
{
return 0;
}
}
}
//3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
count=0; //计数器
int r = i/3;//获得大格子所在行
r *= 3;
int c = j/3;//获得大格子所在列
c *= 3;
char b[9] = {board[r][c],board[r][c+1],board[r][c+2],
board[r+1][c],board[r+1][c+1],board[r+1][c+2],
board[r+2][c],board[r+2][c+1],board[r+2][c+2]};//获得大格子内的所有数
for(int k=0;k<9;k++){//遍历上面的数组
if(b[k] == now){//如果遍历的这个数和当前的数相等
count++;//计数器+1 (遍历必然会遍历本身的数)
if(count == 2){//如果这个数在格子内出现两次 ,即出现重复数
return 0;//数独不合格
}
}
}
}
}
}
return 1;
}
};