题目描述
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.
- 思路
判断给定的矩阵是否是合法的数独(每行/每列不重复,且每个小格子不重复)。
定义三个数组,分别标记每行的数字,每列的数字和每个小格子的数字。一遍遍历即可,难点是根据一个坐标判断其所在的是哪一个小格子,可以求出来它前面存在几个格子(i / 3 * 3),然后再求出来在当前行处于第几个格子(j / 3),相加即为第几个小格子。
public class Solution {
public boolean isValidSudoku(char[][] board) {
if(board == null || board.length != 9 || board[0].length != 9)
return false;
boolean[][] row = new boolean[9][9];
boolean[][] col = new boolean[9][9];
boolean[][] grid = new boolean[9][9];
for(int i=0; i<board.length; i++){
for(int j=0; j<board[i].length; j++){
if(board[i][j] == '.')
continue;
int num = board[i][j] - '0' - 1; //将数字转化为0--8节省空间
//行
if(row[i][num] == true)
return false;
//列
if(col[j][num] == true)
return false;
//方格
int cnt = i / 3 * 3 + j / 3; //前i行格子数 + 当前行第几个格子 = 现在第几个格子
if(grid[cnt][num] == true)
return false;
row[i][num] = true;
col[j][num] = true;
grid[cnt][num] = true;
}
}
return true;
}
}