leetcode 36 有效的数独

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

解法 分成九宫格然后位运算

class Solution {
    public boolean isValidSudoku(char[][] board) {
       for(int i = 0; i < 9; i ++){
        // hori, veti, sqre分别表示行、列、小宫
        int hori = 0, veti = 0, sqre = 0;
        for(int j = 0; j < 9; j ++){
            // 由于传入为char,需要转换为int,减48
            int h = board[i][j] - 48;
            int v = board[j][i] - 48;
            int s = board[3 * (i / 3) + j / 3][3 * (i % 3) + j % 3] - 48;
            // "."的ASCII码为46,故小于0代表着当前符号位".",不用讨论
            if(h > 0){
                hori = sodokuer(h, hori);
            }
            if(v > 0){
                veti = sodokuer(v, veti);
            }
            if(s > 0){
                sqre = sodokuer(s, sqre);
            }
            if(hori == -1 || veti == -1 || sqre == -1){
                return false;
            }
        }
    }
    return true;
}

private int sodokuer(int n, int val){
    return ((val >> n) & 1) == 1 ? -1 : val ^ (1 << n);
}
}

 

你可能感兴趣的:(leetcode)