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.
注意到题目中说的,只要当前已经填充的数字是合法的就可以,不一定要这个数独是有解.(下面说的九宫格都是指3*3的网格)
在检测行是否合法时,i 表示矩阵的行,j 表示矩阵的列;
检测列是否合法时,i 表示矩阵的列,j 表示矩阵的行;检测九宫格是否合法时,i 表示九宫格的标号,j 表示九宫格里的每个元素(只是我们需要根据i、j定位相应的元素到原来的矩阵: 第 i 个九宫格里面的第 j 个元素在原矩阵的第 3*(i/3) + j/3 行,第 3*(i%3) + j%3)列 ,“/” 表示整数除法)
public class Solution {
public boolean isValidSudoku(char[][] board) {
// int[] rowValid, columnValid, subBoardValid; //variable rowValid might not have been initialized
int[] rowValid = new int[10]; //用于验证行有效性,不同行可以重用
int[] columnValid = new int[10]; //用于验证列有效性,不同列 可以重用
int[] subBoardValid = new int[10]; //用于确定小九宫格有效性,不同个可以重用
for(int i = 0; i < 9; i++){
Arrays.fill(rowValid, 0);
Arrays.fill(columnValid, 0);
Arrays.fill(subBoardValid, 0);
for(int j = 0; j < 9; j++) {
if(!checkValid(rowValid, board[i][j] - '0') || !checkValid(columnValid, board[j][i] - '0') || !checkValid(subBoardValid, board[3*(i/3) + j/3][3*(i%3) + j%3] - '0'))
return false;
}
}
return true;
}
public boolean checkValid(int[] vec, int val) {
if(val < 0) return true; //该方格内容为‘.’
if(val > 9) return false; // 数值大于9无效
if(vec[val] == 1) return false; //将方格内值为数组索引
vec[val] =1; //初始值为0,在此设置为1,若有重复则可经上一句if判断得出无效结果。
return true;
}
}
关联内容http://write.blog.csdn.net/postedit