/**
* 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;
}
}