題目
請判定一個數獨是否有效。
該數獨可能只填充了部分數字,其中缺少的數字用 .表示。
注意事項
一個合法的數獨(僅部分填充)并不一定是可解的。我們僅需使填充的空格有效即可。
說明
什么是 數獨?
http://sudoku.com.au/TheRules.aspx
http://baike.baidu.com/subview/961/10842669.htm
樣例
shudu.PNG
上面就是一個合法數獨的樣例
分析
初看上去題目似乎很復雜,其實不然。本題就是判斷數組行列不能有重復元素,以及小九宮格不能有重復元素的算法。
首先,分別判斷行,列,最后判斷九宮格。
代碼
class Solution {
/**
* @param board: the board
@return: wether the Sudoku is valid
*/
public boolean isValidSudoku(char[][] board) {
boolean[] visited = new boolean[9];
// row
for(int i = 0; i<9; i++){
Arrays.fill(visited, false);
for(int j = 0; j<9; j++){
if(!process(visited, board[i][j]))
return false;
}
}
//col
for(int i = 0; i<9; i++){
Arrays.fill(visited, false);
for(int j = 0; j<9; j++){
if(!process(visited, board[j][i]))
return false;
}
}
// sub matrix
for(int i = 0; i<9; i+= 3){
for(int j = 0; j<9; j+= 3){
Arrays.fill(visited, false);
for(int k = 0; k<9; k++){
if(!process(visited, board[i + k/3][ j + k%3]))
return false;
}
}
}
return true;
}
private boolean process(boolean[] visited, char digit){
if(digit == '.'){
return true;
}
int num = digit - '0';
if ( num < 1 || num > 9 || visited[num-1]){
return false;
}
visited[num-1] = true;
return true;
}
};