检查所有的行,列,九宫格。用flag来标记某元素是否重复出现过
这类问题关键还是要把结构写清楚,要让code self-explanatory!
package Level2;
/**
* Valid Sudoku
* etermine 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 '.'.
http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png
A partially filled sudoku which is valid.
*
*/
public class S37 {
public static void main(String[] args) {
}
public boolean isValidSudoku(char[][] board) {
return isValidRow(board) && isValidColumn(board) && isValidBox(board);
}
// 检查所有的行
public boolean isValidRow(char[][] board){
for(int i=0; i<9; i++){
boolean[] flag = new boolean[10];
for(int j=0; j<9; j++){
if(!markFlag(flag, board[i][j])){
return false;
}
}
}
return true;
}
// 检查所有的列
public boolean isValidColumn(char[][] board){
for(int i=0; i<9; i++){
boolean[] flag = new boolean[10];
for(int j=0; j<9; j++){
if(!markFlag(flag, board[j][i])){
return false;
}
}
}
return true;
}
// 检查所有的9宫格
public boolean isValidBox(char[][] board){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
boolean[] flag = new boolean[10];
for(int m=0; m<3; m++){
for(int n=0; n<3; n++){
if(!markFlag(flag, board[i*3+m][j*3+n])){
return false;
}
}
}
}
}
return true;
}
public boolean markFlag(boolean[] flag, char c){
if(c == '.'){
return true;
}
int index = c - '0';
if(flag[index]){ // 之前已经出现过
return false;
}else{ // 第一次出现
flag[index] = true;
return true;
}
}
}
public class Solution {
public boolean isValidSudoku(char[][] board) {
return isValidRow(board) && isValidCol(board) && isValidBox(board);
}
public boolean isValidRow(char[][] board) {
for(int i=0; i<board.length; i++) {
int[] flag = new int[10];
for(int j=0; j<board[0].length; j++) {
if(!check(flag, board[i][j])) {
return false;
}
}
}
return true;
}
public boolean isValidCol(char[][] board) {
for(int j=0; j<board[0].length; j++) {
int[] flag = new int[10];
for(int i=0; i<board.length; i++) {
if(!check(flag, board[i][j])) {
return false;
}
}
}
return true;
}
public boolean isValidBox(char[][] board) {
for(int i=0; i<board.length; i+=3) {
for(int j=0; j<board[0].length; j+=3) {
int[] flag = new int[10];
for(int m=0; m<3; m++) {
for(int n=0; n<3; n++) {
if(!check(flag, board[i+m][j+n])) {
return false;
}
}
}
}
}
return true;
}
public boolean check(int[] flag, char c) {
if(c == '.') {
return true;
}
if(flag[c-'0'] == 1) {
return false;
} else {
flag[c-'0'] = 1;
return true;
}
}
}