二刷LeetCode--36. 有效的数独(C++版本)

该代码段展示了一个C++函数,用于检查9x9的数独板是否有效。它通过遍历行、列和每个3x3的小宫格,检查每个数字1到9是否只出现一次,遇到非数字字符则跳过。若在遍历过程中发现重复数字,则立即返回false,表示无效;否则,如果所有检查都通过,返回true,表示数独有效。

单纯的行和列的判断较为简单,对于每一个元素如果是数字的话就将其对应的数组下标的元素变为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;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值