单纯的暴力搜索
class Solution {
public boolean isValidSudoku(char[][] board) {
boolean[] used = new boolean[9];
// 按行遍历每个数是否出现过
for(int i = 0; i < 9; i++){
//清空
Arrays.fill(used, false);
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
int tmp = board[i][j] - '1';
if(used[tmp]) return false;
used[tmp] = true;
}
}
}
//按列, 此时, i是行号, j是列号
for(int i = 0; i < 9; i++){
Arrays.fill(used, false);
for(int j = 0; j < 9; j++){
if(board[j][i] != '.'){
int tmp = board[j][i] - '1';
if(used[tmp]) return false;
used[tmp] = true;
}
}
}
//按小方格搜索
for(int i = 0; i < 9; i += 3){
for(int j = 0; j < 9; j += 3){
Arrays.fill(used, false);
for(int x = i; x < 3 + i; x++){
for(int y = j; y < 3 + j; y++){
if(board[x][y] != '.'){
int tmp = board[x][y] - '1';
if(used[tmp]) return false;
used[tmp] = true;
}
}
}
}
}
return true;
}
}
二刷, 熟悉二维矩阵的搜索逻辑,理解按行, 按列, 按方格搜索时的处理细节, 加深理解. 20200711
class Solution {
public boolean isValidSudoku(char[][] b) {
boolean[] used = new boolean[9];
//按行校验
for(int i = 0; i < b.length; i++){
Arrays.fill(used, false);
for(int j = 0; j < b[0].length; j++){
if(b[i][j] != '.'){
int tmp = b[i][j] - '1';
if(used[tmp]) return false;
used[tmp] = true;
}
}
}
//按列校验
for(int i = 0; i < b.length; i++){
Arrays.fill(used, false);
for(int j = 0; j < b[0].length; j++){
if(b[j][i] != '.'){
int tmp = b[j][i] - '1';
if(used[tmp]) return false;
used[tmp] = true;
}
}
}
//按小单元格搜索
for(int i = 0; i < 9; i += 3){
for(int j = 0; j < 9; j += 3){
Arrays.fill(used, false);
for(int x = i; x < 3+i; x ++){
for(int y = j; y < 3+j; y ++){
if(b[x][y] != '.'){
int tmp = b[x][y] - '1';
if(used[tmp]) return false;
used[tmp] = true;
}
}
}
}
}
return true;
}
}