题目:
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.
思路:
本题的重点不在于算法(本题不需要用到什么算法,因此属于简单类型),而是在于Note中的强调。
一开始我的思路是将该数独解出来,得到解则为true,得不到则为false。但是这样需要一个NP的复杂度,超时。
后来仔细看了一下题目,发现数独的valid的定义是:Only the filled cells need to be validated.也就是仅仅需要将已有的数字进行验证是否合法即可。
那么,解答思路仅仅是,对于每一个数字,判断每行、每列和每宫 是否合法。
合法,即在该行,该列和该宫都只出现一次。
AC代码:
public class Valid_Sudoku {
private boolean isAvalible(char[][] board, int r,int c){
char i=board[r][c];
int a = r/3,b=c/3;
int beginX = 3*a,beginY = 3*b;
int count=0;
int j;
for(j=0;j<board.length ;j++){
if(j==c)
continue;
if(board[r][j]==(""+i).charAt(0))
break;
}
if(j==board.length)
count++;
if(count==1){
for(j=0;j<board.length;j++){
if(j==r)
continue;
if(board[j][c]==(""+i).charAt(0))
break;
}
if(j==board.length)
count++;
if(count==2){
boolean flag=false;
for(int cc=beginX;cc<beginX+3 && !flag;cc++)
for(int dd=beginY;dd<beginY+3 && !flag;dd++){
if(cc==r && dd==c)
continue;
if(board[cc][dd]==(""+i).charAt(0))
flag=true;
}
if(!flag)
count++;
if (count==3){
return true;
}
}
}
return false;
}
public 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(!isAvalible(board,i,j)){
return false;
}
}
}
}
return true;
}
public static void main(String[] args){
Valid_Sudoku valid_sudoku = new Valid_Sudoku();
char[][] board = {{'5','3','.','.','7','.','.','.','.'},
{'6','.','.','1','9','5','.','.','.'},
{'.','9','8','.','.','.','.','6','.'},
{'8','.','.','.','6','.','.','.','3'},
{'4','.','.','8','.','3','.','.','1'},
{'7','.','.','.','2','.','.','.','6'},
{'.','6','.','.','.','.','2','8','.'},
{'.','.','.','4','1','9','.','.','5'},
{'.','.','.','.','8','.','.','7','9'}};
System.out.println(valid_sudoku.isValidSudoku(board));
}
}