【题目】
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.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
【思路】
sudoku就是数独,检查规则就是,不能在同一行同一列出现相同的数字,也不能在一个九宫格内出现相同的数字。
首先判断:
1. 是不是“."如果是:直接跳过继续
2.是不是不是0-9的数字,如果不是这个范围的数字,直接返回错误。
row[i][num] = true 代表num在第i行已经出现。
row的每一行代表board里的一行,一共9行,列代表每个数字0-8一共9个数字。
col同理。
box用来记录在九个九宫格里 每一个宫格里面数字出现的情况,九宫格位置的计算:
(i/3)*3:代表 i/3能够取整: 4/3 = 1 ; 5/3 = 1,落在第二行九宫里,*3 是经历的行数,
j/3就是第几列宫格。
对于每一个数字:如果这三项有一项为true,就不符合rule,就要返回false.
否则就说明没有出现过,那么要把这三项天威true;
【代码】
public static boolean isValidSudoku(char[][] board) {
boolean[][] row = new boolean[9][9];
boolean[][] col = new boolean[9][9];
boolean[][] box = new boolean[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c == '.')
continue;
if (c < '0' || c > '9')
return false;
int number = c - '1';
if (row[i][number] || col[j][number] || box[(i / 3) * 3 + j / 3][number])
return false;
row[i][number] = true;
col[j][number] = true;
box[(i / 3) * 3 + j / 3][number] = true;
}
}
return true;
}