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 '.'
.
翻译一下就是
给你个数独的二维数组,有的地方数字是有的,有的地方没有数字,没有数字的地方就是“。”来代替
然后每行、每列、每个九宫格内的数字不要重复
很简单的一题
但是我的办法就很蠢了,先找每行和每列是不是重复了,然后再单独找九宫格里面是不是重复了
我用的hashset来处理的
public class Solution {
public boolean isValidSudoku(char[][] board) {
for(int i=0;i<9;i++){
Set<Character> hash1=new HashSet<Character>();
Set<Character> hash2=new HashSet<Character>();
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
if(!hash1.add(board[i][j]))
return false;
}
if(board[j][i]!='.'){
if(!hash2.add(board[j][i]))
return false;
}
}
}
for(int k=0;k<9;k++){
int row=k/3;
int col=k%3;
Set<Character> hash3=new HashSet<Character>();
for(int i=row*3;i<row*3+3;i++){
for(int j=3*col;j<3*col+3;j++){
if(board[i][j]!='.'){
if(!hash3.add(board[i][j]))
return false;
}
}
}
}
return true;
}
}
然后还有一种很奇妙的算法,只用了两重循环就解决了
思想就是,用三个9*9的二维数组默认全是0,分别来存每行、每列、每个九宫格的值,重点是算的时候很妙!
就是算出给的二维数组[i][j]位置的值int num=board[i][j]-'0'-1,然后再自己的9*9数组中把这个num位置置为1
比如第i行,那就是[i][num]=1,第j列就是[num][j]=1,重点就是第k个九宫格怎么表示,k = i / 3 * 3 + j / 3,于是[k][num]=1
最后再到num出现时,如果那一行或者那一列或者那个九宫格有过了,那么此时(used1[i][num]==1 )|| (used2[j][num]==1) ||(used3[k][num]==1)
好了,我描述的也不清楚,直接上代码吧
public class Solution {
public boolean isValidSudoku(char[][] board) {
int[][] used1 = new int[9][9];
int[][] used2 = new int[9][9];
int[][] used3 = new int[9][9];
for(int i = 0; i < 9; ++ i)
for(int j = 0; j < 9; ++ j)
if(board[i][j] != '.')
{
int num = board[i][j] - '0' - 1, k = i / 3 * 3 + j / 3;
if((used1[i][num]==1 )|| (used2[j][num]==1) ||(used3[k][num]==1))
return false;
used1[i][num] = used2[j][num] = used3[k][num] = 1;
}
return true;
}
}