领扣LintCode算法问题答案-389. 判断数独是否合法

领扣LintCode算法问题答案-389. 判断数独是否合法

目录

  • 389. 判断数独是否合法
  • 鸣谢

389. 判断数独是否合法

请判定一个数独是否有效。

该数独可能只填充了部分数字,其中缺少的数字用 . 表示。

样例 1:

输入:
[“53…7…”,“6…195…”,".98…6.",“8…6…3”,“4…8.3…1”,“7…2…6”,".6…28.","…419…5","…8…79"]
输出: true
样例说明:
这个数独如下图所示,他是合法的。

样例 2:

输入:
[“53…75…”,“6…195…”,".98…6.",“8…6…3”,“4…8.3…1”,“7…2…6”,".6…28.","…419…5","…8…79"]
输出: false
样例说明:
这个数独如下图所示。他是不合法的因为他的第一行和第六列有两个5。

public class Solution {
     
    /**
     * @param board: the board
     * @return: whether the Sudoku is valid
     */
    public boolean isValidSudoku(char[][] board) {
     
        // write your code here
        if (board == null) {
     
            return true;
        }

        int maxR = board.length;
        int maxC = board[0].length;

        // check row
        for (int r = 0; r < maxR; r++) {
     
            int bits = 0;
            for (int c = 0; c < maxC; c++) {
     
                char ch = board[r][c];
                if ('.' != ch) {
     
                    int chi = ch;
                    chi -= 48;
                    int bitValue = 1 << chi;
                    if ((bits & bitValue) == bitValue) {
     
                        return false;
                    }
                    bits |= bitValue;
                }
            }
        }

        // check column
        for (int c = 0; c < maxR; c++) {
     
            int bits = 0;
            for (int r = 0; r < maxC; r++) {
     
                char ch = board[r][c];
                if ('.' != ch) {
     
                    int chi = ch;
                    chi -= 48;
                    int bitValue = 1 << chi;
                    if ((bits & bitValue) == bitValue) {
     
                        return false;
                    }
                    bits |= bitValue;
                }
            }
        }

        // check 3 * 3 grid
        for (int r = 0; r < maxR; r+=3) {
     
            for (int c = 0; c < maxC; c+=3) {
     
                if (r + 2 < maxR
                        && c + 2 < maxC) {
     
                    int bits = 0;
                    for (int i = 0; i < 3; i++) {
     
                        for (int j = 0; j < 3; j++) {
     
                            char ch = board[r+i][c+j];
                            if ('.' != ch) {
     
                                int chi = ch;
                                chi -= 48;
                                int bitValue = 1 << chi;
                                if ((bits & bitValue) == bitValue) {
     
                                    return false;
                                }
                                bits |= bitValue;
                            }
                        }
                    }
                }
            }
        }

        return true;
    }
}

原题链接点这里

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

你可能感兴趣的:(算法,算法)