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.
这道题其实只是为了判断当前局面是否是一个有效的数独,并不是让填写空白的数。
局面中含‘.'的代表还未填写的区域,这个区域不需要进行判断,只需要判断已经有数的部分是否出现重复出现的状况。
Source1
public class Solution {
public boolean isValidSudoku(char[][] board){
for(int i = 0; i < 9 ; i++){
int[] flag = new int[9];
for(int j = 0; j < 9; j++){
if(!isTrue(board[i][j], flag)) return false;
}
flag = new int[9];
for(int j = 0; j < 9; j++){
if(!isTrue(board[j][i], flag)) return false;
}
}
for(int i = 0; i < 3; i++){
int[] flag = new int[9];
for(int j = 3*i; j < 3*i+3; j++){
for(int k = 0; k < 3; k++){
if(!isTrue(board[j][k], flag)) return false;
}
}
flag = new int[9];
for(int j = 3*i; j < 3*i+3; j++){
for(int k = 3; k < 6 ; k++){
if(!isTrue(board[j][k], flag)) return false;
}
}
flag = new int[9];
for(int j = 3*i; j < 3*i+3; j++){
for(int k = 6; k < 9 ; k++){
if(!isTrue(board[j][k], flag)) return false;
}
}
}
return true;
}
public boolean isTrue(char key, int[] flag){
if(key == '.') return true;
if(++flag[key - '1'] > 1) return false;
if((++flag[key - '1']) <= 1) return true;
return true;
}
}
Source2 利用HashSet
public class Solution {
public boolean isValidSudoku(char[][] board) {
for(int row = 0; row < board.length; row++){
HashSet<Character> ht = new HashSet<Character>();
for(int col = 0; col < board[0].length; col++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
for(int col = 0; col < board[0].length; col++){
HashSet<Character> ht = new HashSet<Character>();
for(int row = 0; row < board.length; row++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
for(int i = 0; i < 3; i++){
HashSet<Character> ht = new HashSet<Character>();
for(int row = i * 3; row < i * 3 + 3; row++){
for(int col = 0; col < 3; col++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
ht = new HashSet<Character>();
for(int row = i * 3; row < i * 3 + 3; row++){
for(int col = 3; col < 6; col++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
ht = new HashSet<Character>();
for(int row = i * 3; row < i * 3 + 3; row++){
for(int col = 6; col < 9; col++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
}
return true;
}
}
Source3 小九宫格可以写为for(i = 0; i < 9;i++) row = i/3*3~i/3*3+3 col = (i%3)*3~(i%3)*3+3
public class Solution {
public boolean isValidSudoku(char[][] board) {
for(int row = 0; row < board.length; row++){
HashSet<Character> ht = new HashSet<Character>();
for(int col = 0; col < board[0].length; col++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
for(int col = 0; col < board[0].length; col++){
HashSet<Character> ht = new HashSet<Character>();
for(int row = 0; row < board.length; row++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
for(int i = 0; i < 9; i++){
HashSet<Character> ht = new HashSet<Character>();
for(int row = i / 3 * 3; row < i / 3 * 3 + 3; row++){
for(int col = (i % 3) * 3; col < (i % 3) * 3 + 3; col++){
if(board[row][col] == '.') continue;
if(!ht.contains(board[row][col])){
ht.add(board[row][col]);
}
else return false;
}
}
}
return true;
}
}
Test
public static void main(String[] args){
char[][] board = new char[9][9]; //***
Scanner in = new Scanner(System.in);
for(int i = 0; i < 9; i++){
String a = in.nextLine();
//char[] b = a.toCharArray();
//System.arraycopy(b, 0, board[i], 0, board[i].length);
board[i] = a.toCharArray();
}
System.out.println(new Solution().isValidSudoku(board));
}
Test2
public static void main(String[] args){
char[][] board = new char[9][]; //***
Scanner in = new Scanner(System.in);
String a = in.nextLine();
a = a.replace("\"", "");
String[] b = a.split(",");
for(int i = 0; i < b.length; i++){
board[i] = b[i].toCharArray();
}
System.out.println(new Solution().isValidSudoku(board));
}