36. 有效的数独

在这里插入图片描述
在这里插入图片描述
一定是一个9*9的数独,为了一遍遍历完,我们定义三个hash表。也就是三个二维数组,行列和九宫格。
row[i][j]存的是第i行的第j个数字是否存在,如果为0,证明在第i行第一次出现j,在遍历的时候就++。列也是如此。九宫格怎么定义每一块呢?
在这里插入图片描述
(i/3)*3 + j/3就是当前格子所在的九宫格,也是九个九宫格。如果当前这个数所在的行或者列或者九宫格有这个数字了,也就是对应的位为1,那就直接返回false

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        //永远是9*9形式的数独,不是dfs就是dp
        //行,列,九宫格三种状态都要搜索
        int row[9][10] = {0};
        int col[9][10] = {0};
        int box[9][10] = {0};
        for(int i = 0; i < board.size(); ++i){
            for(int j = 0; j < board[0].size(); ++j){
                if(board[i][j] == '.') continue;
                int cur = board[i][j] - '0';
                if(row[i][cur] != 0) return false;
                if(col[j][cur] != 0) return false;
                if(box[(i/3)*3+j/3][cur] != 0) return false;
                row[i][cur]++;
                col[j][cur]++;
                box[(i/3)*3+j/3][cur]++;
            }
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值