/**
* 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 '.'.
* A partially filled sudoku which is valid.
*
* 根据以下规则确定数独是否有效:
* 数独板可以部分填充,其中空单元格填充字符 “ . ”。就是 空的单元格用 . 来代替。
* 一个部分填充的数独是有效的。
*/
解析:
* 这道题目的意思是 这个数独是否有效,返回 true, false.
* 有三种情况不成立,将返回false:
* 第一种: 循环每一行, 如果出现了相同的数字就不成立, 遇到 . 直接跳过
* 第二种: 循环每一列, 如果出现了相同的数字就不成立, 遇到 . 直接跳过
* 第三种: 循环每一个小的九宫格, 如果出现了相同的数字就不成立, 遇到 . 直接跳过(这个需要注意一下循环的方法,规律)
import java.util.HashSet; import java.util.Set; /** * 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 '.'. * A partially filled sudoku which is valid. * * 根据以下规则确定数独是否有效: * 数独板可以部分填充,其中空单元格填充字符 “ . ”。就是 空的单元格用 . 来代替。 * 一个部分填充的数独是有效的。 * * 解析: * 这道题目的意思是 这个数独是否有效,返回 true, false. * 有三种情况不成立,将返回false: * 第一种: 循环每一行, 如果出现了相同的数字就不成立, 遇到 . 直接跳过 * 第二种: 循环每一列, 如果出现了相同的数字就不成立, 遇到 . 直接跳过 * 第三种: 循环每一个小的九宫格, 如果出现了相同的数字就不成立, 遇到 . 直接跳过(这个需要注意一下循环的方法,规律) */ public class Main40 { public static void main(String[] args) { char[][] board = { {'.','.','4','.','.','.','6','3','.'}, {'.','.','.','.','.','.','.','.','.'}, {'5','.','.','.','.','.','.','9','.'}, {'.','.','.','5','6','.','.','.','.'}, {'4','.','3','.','.','.','.','.','.'}, {'.','.','.','7','.','.','.','.','.'}, {'.','.','.','1','.','.','.','.','.'}, {'.','.','.','.','.','.','.','.','.'}, {'.','.','.','.','.','.','.','.','.'} }; System.out.println(Main40.isValidSudoku(board)); } public static boolean isValidSudoku(char[][] board) { Set<Character> set = new HashSet<>(); // 第一种情况: for (int i=0;i<board.length;i++) { for (int j=0;j<board[i].length;j++) { if (board[i][j] == '.') { continue; } if (!set.contains(board[i][j])) { set.add(board[i][j]); }else{ return false; } } set.clear(); } // 第二种情况: for (int j=0;j<board[0].length;j++) { for (int i=0;i<board.length;i++) { if (board[i][j] == '.') { continue; } if (!set.contains(board[i][j])) { set.add(board[i][j]); }else{ return false; } } set.clear(); } // 第三种情况: for (int k=0;k<board.length;k++) { for (int i=k/3*3;i<k/3*3+3;i++) { for (int j=k%3*3;j<k%3*3+3;j++) { if (board[i][j] == '.') { continue; } if (!set.contains(board[i][j])) { set.add(board[i][j]); }else{ return false; } } } set.clear(); } return true; } }