个人练习题——数独检查

问题遇到的现象和发生背景

今天在力扣上做题,关于检查数独是否正确那题,输出结果和预期结果一直不对

问题相关代码,请勿粘贴截图
 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;
    }
};