1+6t,8+128gb才279,还要啥自行车?!?!# PDA - 掌中宝
d*i
1 楼
看到一个答案,可以用一个for loop来检测sudoku 是否valid。
但是dan实在看不懂这句话: board[row / 3 * 3 + i / 3][col / 3 * 3 + i % 3] ==
num
不知道为什么可以check 3 * 3 blocks, 一会除一会乘一会求余,把我看晕。有能帮
忙解释下么?
public static boolean isValidSudoku(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (board[i][j] != '.') {
if (!isValid(board, board[i][j], i, j)) {
return false;
}
}
}
}
return true;
}
public static boolean isValid(char[][] board, char num, int row, int col
) {
for (int i = 0; i < 9; i++) {
// check horizontal 9 blocks
if (i != col && board[row][i] == num) return false;
// check vertical 9 blocks
if (i != row && board[i][col] == num) return false;
// check 3 * 3 blocks
if ((row / 3 * 3 + i / 3 != row) && (col / 3 * 3 + i % 3 != col)
&& board[row / 3 * 3 + i / 3][col / 3 * 3 + i % 3] == num) return false;
}
return true;
}
但是dan实在看不懂这句话: board[row / 3 * 3 + i / 3][col / 3 * 3 + i % 3] ==
num
不知道为什么可以check 3 * 3 blocks, 一会除一会乘一会求余,把我看晕。有能帮
忙解释下么?
public static boolean isValidSudoku(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (board[i][j] != '.') {
if (!isValid(board, board[i][j], i, j)) {
return false;
}
}
}
}
return true;
}
public static boolean isValid(char[][] board, char num, int row, int col
) {
for (int i = 0; i < 9; i++) {
// check horizontal 9 blocks
if (i != col && board[row][i] == num) return false;
// check vertical 9 blocks
if (i != row && board[i][col] == num) return false;
// check 3 * 3 blocks
if ((row / 3 * 3 + i / 3 != row) && (col / 3 * 3 + i % 3 != col)
&& board[row / 3 * 3 + i / 3][col / 3 * 3 + i % 3] == num) return false;
}
return true;
}