Texas_PL 2022-07-22 13:57 采纳率: 50%
浏览 28

个人练习题——数独检查

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

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

问题相关代码,请勿粘贴截图
 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=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条回答 默认 最新

  • 飞天赤狐 2022-07-24 14:40
    关注

    兄弟,你的代码问题在于
    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;
        }
    };
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月22日

悬赏问题

  • ¥30 靶向捕获探针设计软件包
  • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题
  • ¥20 遥感植被物候指数空间分布图制作
  • ¥15 安装了xlrd库但是import不了…
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker
  • ¥15 数学建模大赛交通流量控制
  • ¥15 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢
  • ¥50 paddleocr最下面一行似乎无法识别
  • ¥15 求某类社交网络数据集