这是一个很好的算法 在leetcode 也曾出现,今天我们详细分析一下:
题目简介:
/*** 请你判断一个9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。** 数字1-9在每一行只能出现一次。* 数字1-9在每一列只能出现一次。* 数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)* * 注意:* 一个有效的数独(部分已被填充)不一定是可解的。* 只需要根据以上规则,验证已经填入的数字是否有效即可。* 空白格用'.'表示。* * 示例 1:* 输入:board ={'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'}};* 输出:true*/
测试代码:
public static void main(String[] args) {String[][] boardS = new String[9][10];char[][] board = new char[9][10];board = new char[][]{{'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'}};boolean validSudoku1 = isValidSudoku1(board);System.out.println(validSudoku1);}private static boolean isValidSudoku1(char[][] board) {boolean[][] row = new boolean[9][10];boolean[][] col = new boolean[9][10];boolean[][] bucket = new boolean[9][10];for(int i = 0;i < 9;i++){for(int j = 0;j < 9;j++){/*** 0 1 2* 0 1 2* 0 1 2** 3 4 5* 3 4 5* 3 4 5* ....***/int bid = 3 * (i / 3) + (j / 3);if(board[i][j] != '.'){int num = board[i][j] - '0';if(row[i][num] || col[j][num] || bucket[bid][num]){return false;}row[i][num] = true;//行检查col[j][num] = true;//列检查bucket[bid][num] = true;//九宫格检查}}}return true;}
注释很清晰,多多练习理解,定会早日掌握!
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 验证已经填入的数字是否有效即可