题目
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
解题
class Solution {
public boolean isValidSudoku(char[][] board) {
int len = board.length;
//用来判断数字是否重复的位向量
boolean[] dp = new boolean[len];
for(int i = 0;i<len;i++){
//扫描每一行
for(int j=0;j<len;j++){
//当前扫描到的数字大于1的话
if(board[i][j]-'1'>=0){
//判断重复(每一行)
if(dp[board[i][j]-'1']){
return false;
}
dp[board[i][j]-'1'] = true;
}
}
Arrays.fill(dp,false);
//扫描每一列
for(int j=0;j<len;j++){
if(board[j][i]-'1'>=0){
//判断每一列的数字是否重复
if(dp[board[j][i]-'1']){
return false;
}
dp[board[j][i]-'1'] = true;
}
}
//将每一列置为false
Arrays.fill(dp,false);
//获取每个小正方形在大正方形中左上角的坐标
int row = i/3;
int col = i%3;
//使用横纵坐标乘以三即使当前小正方形最左上角在9*9矩阵中的坐标
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
if(board[row*3+j][col*3+k]-'1'>=0){
if( dp[board[row*3+j][col*3+k]-'1']){
return false;
}
dp[board[row*3+j][col*3+k]-'1'] = true;
}
}
}
Arrays.fill(dp,false);
}
return true;
}
}