判断一个数独是否有效,
说明:
一个有效的数独(填了一部分的)不一定是可解的,只要已经填的数字是有效的即可。
分析:
该题目不要判断整个数独是否有解,只需要判断当前给出的数独是否有效。因此只需要判断行和列是否有效,判断每个块是否有效。而判断一行中是否有重复的数字,最好的数据结构莫过于Set结构了。
使用rowSet,colSet两个Set结构来分别保存当前遍历的行和列,(i, j)表示行,则(j, i)就表示列。因此可以在判断第一行是否有效的同时,顺便判断第一列是否有效;块单独做检查;
public boolean isValidSudoku(char[][] board) {
if(board == null || board.length != 9 || board[0].length != 9)
return false;
Set<Character> rowset = new HashSet<>();
Set< Character> colset = new HashSet<>();
for(int i = 0; i < board.length; i++){
rowset.clear();
colset.clear();
for(int j = 0; j < board[0].length; j++){
if(board[i][j] != '.'){//检验行是否有重复
if(rowset.contains(board[i][j])){
return false;
}
rowset.add(board[i][j]);
}
if(board[j][i] != '.'){//检验列是否重复
if(colset.contains(board[j][i])){
return false;
}
colset.add(board[j][i]);
}
if(i%3 == 0 && j%3 == 0){
if(!bloack(i,j,board)){
return false;
}
}
}
}
return true;
}
public boolean bloack(int i, int j, char[][] board) {
// TODO Auto-generated method stub
Set<Character> blockset = new HashSet<>();
for(int a = i; a < i+3; a++){
for(int b = j; b < j+3; b++){
if(board[a][b] != '.'){
if(blockset.contains(board[a][b])){
return false;
}
blockset.add(board[a][b]);
}
}
}
return true;
}