主要分为三步:行检测,列检测,以及小区域检测
/**
* Created by jason on 13-12-16.
*/
public class ValidSudoku {
public boolean isValidSudoku(char[][] board) {
return isvalidRow(board) && isvalidColumn(board) && isvalidRegieon(board);
}
public boolean isvalidRow(char[][] board) {
int[] count = new int[9];
for (int i = 0; i < board.length; i++) {
memset(count, 0);
for (int j = 0; j < board[0].length; j++) {
if (!add(board[i][j], count))
return false;
}
}
return true;
}
public boolean isvalidColumn(char[][] board) {
int[] count = new int[9];
for (int i = 0; i < board.length; i++) {
memset(count, 0);
for (int j = 0; j < board[0].length; j++) {
if (!add(board[j][i], count))
return false;
}
}
return true;
}
public boolean isvalidRegieon(char[][] board) {
int increment = (int) Math.sqrt(board.length);
int[] count = new int[9];
for (int k = 0; k < board.length; k++) {
memset(count, 0);
int ii = k / 3 * 3;
int jj = k % 3 * 3;
for (int i = ii; i < ii + increment; i++) {
for (int j = jj; j < jj + increment; j++) {
if (!add(board[i][j], count))
return false;
}
}
}
return true;
}
public boolean add(char c, int[] count) {
if (c == '.') return true;
else return ++count[c - '1'] <= 1;
}
public void memset(int[] count, int v) {
for (int i = 0; i < count.length; i++) {
count[i] = v;
}
}
}