[LeetCode] Valid Sudoku

Valid Sudoku

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’.
Sudoku

A partially filled sudoku which is valid.

Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

  • 题意:题意比较简单,就是给出一个数独的矩阵,问是不是成立的:
    1, 每一行要不同
    2, 每一列要不同
    3, 每一个子格子不要同(图中粗线隔开)
  • 解法:利用二进制状态压缩方法分别记录每一行,第一列和9个小格子的压缩值,这二进制状态就是,一个整数有32位,我们用后面10位来表示数字0到9,也就是说如果第2位为1,那么说明2有出现,第3位为1,3就有出现,如果哪一位出现了不只一次,就说明有冲突了,不是一个合法的数独.怎么判断有没有出现呢,利用位运算&,如果(i&(1<< j))>0则有出现(数i第j位为1),我们把出现的数加到要记录值上面也是利用位运算|,i=i|(1<< j)把i第j位置为1,具体位运算的使用和状态压缩,网上有很多教程.有兴趣可以看看.只是简单的解决这里的问题可以直接看代码.


class Solution {
public:
    //char:'1'~'9'.
    //return: 2^(1~9);
    int powerByChar(char ch) {
        return 1 << (ch - '0');
    }

    //riBlock:引用.
    bool addCharacterToBlock(char ch, int &riBlock) {
        if ('.' == ch) return true;
        if (riBlock & powerByChar(ch)) return false;
        riBlock |= powerByChar(ch);
        return true;
    }

    bool isValidSudoku(vector<vector<char>>& board) {
        bool bResult = true;//初始化成true,一旦有不成立的就成false.
        int iBlocks[10] = {0};//9个小正方形.
        int iColumn[10] = {0};//9列
        int iRow = 0;//每一行.
        for (int i = 0; i < 9 && bResult; ++i) {
            iRow = 0;//把一行初始化成0.
            for (int j = 0; j < 9 && bResult; ++j) {
                bResult &= addCharacterToBlock(board[i][j], iRow);
                bResult &= addCharacterToBlock(board[i][j], iColumn[j]);
                bResult &= addCharacterToBlock(board[i][j], iBlocks[i / 3 * 3 + j / 3]);
            }
        }
        return bResult;
    }
};

欢迎访问我的github,我的leetcode持续更新: https://github.com/tsfissure/LeetCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值