【leetcode 36】 Valid Sudoku 判断数独是否有效

题目

Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.


A partially filled sudoku which is valid.

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

Example 1:

Input:
[
  ["5","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
]
Output: true

Example 2:

Input:
[
  ["8","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being 
    modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.
  • The given board contain only digits 1-9 and the character '.'.
  • The given board size is always 9x9.

 解题思路

玩过数独的人都应该清楚,本题就是要求对给出的9*9数组进行验证,如果满足:

1、横向数字只有1-9且不重复("."为补充占位,后续不再解释)

2、竖向数字只有1-9且不重复

3、把9*9的矩阵分成9个3*3的矩阵,每个矩阵中数字只有1-9且不重复

依照上面的解题思路,就是要对9*9的矩阵进行3次判断,全部校验通过则通过,反之不通过。

代码实现

以下为具体代码实现,仅供参考

public class Main {


    public static void main(String[] args) {
        Main main = new Main();
        char[][] arr = main.init();
        main.isValidSudoku(arr);

    }

    // 包含元素集合
    private Character[] demo = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '.'};

    public boolean isValidSudoku(char[][] board) {
        if (checkHorizontal(board) && checkVertical(board) && checkGrid(board)) {
            System.out.println(true);
            return true;
        } else {
            System.out.println(false);
            return false;
        }

    }

    /**
     * 初始化数组
     *
     * @return
     */
    private char[][] init() {
        char[][] arr = {
                {'5', '3', '.', '.', '7', '.', '.', '.', '.'},
                {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
                {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
                {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
                {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
                {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
                {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
                {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
                {'.', '.', '.', '.', '8', '.', '.', '7', '9'}
        };

//        char[][] arr = {{'8', '3', '.', '.', '7', '.', '.', '.', '.'},
//                {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
//                {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
//                {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
//                {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
//                {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
//                {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
//                {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
//                {'.', '.', '.', '.', '8', '.', '.', '7', '9'}};
        return arr;
    }

    /**
     * 判断横向9个数字是否有重复
     *
     * @param arr
     * @return
     */
    private boolean checkHorizontal(char[][] arr) {
        List<Character> strings = Arrays.asList(demo);
        Set<Character> set = new HashSet<>();
        for (char[] a : arr) {
            set.clear();
            for (char aa : a) {
                if (aa == '.') {
                    continue;
                } else if (strings.contains(aa) && !set.contains(aa)) {
                    set.add(aa);
                } else {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 判断竖向9个数字是否有重复
     *
     * @param arr
     * @return
     */
    private boolean checkVertical(char[][] arr) {
        char[][] tem = new char[9][9];
        // 将原9*9矩阵翻转
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                tem[j][i] = arr[i][j];
            }
        }
        return checkHorizontal(tem);
    }

    /**
     * 判断3*3的9个数字是否有重复
     *
     * @param arr
     * @return
     */
    private boolean checkGrid(char[][] arr) {
        char[][] tem = new char[9][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                // [i / 3 * 3 + j / 3]:确认当前元素属于3*3矩阵中第几块
                // [j % 3 * 3 + i % 3]:确认当前元素在所属元素块中是第几个元素
                tem[i / 3 * 3 + j / 3][j % 3 * 3 + i % 3] = arr[i][j];
            }
        }
        return checkHorizontal(tem);
    }

}
发布了83 篇原创文章 · 获赞 58 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qixinbruce/article/details/104125750