原题:
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.
首先按行检查,每行的元素中1-9只出现一次
再按列检查,同检查行的规则。
最后3*3的九宫格检查。
代码:
class Solution {
public:
int *stamp = new int[10];
bool isValidSudoku(vector<vector<char> > &board) {
for (int i = 0; i<9; i++)
if (!isValidrow(board[i])) return false;
return isValidcolumn(board)&&isValidcube(board);
}
bool isValidrow(vector<char> &row){
for (int i = 0; i<10; i++) stamp[i] = 0;
for( int i = 0; i < row.size(); i++){
if (isValidnum(row[i])) {
if(stamp[row[i]-'1'] == 0) stamp[row[i]-'1'] = 1;
else return false;
}
}
return true;
}
bool isValidcolumn(vector<vector<char>> &board){
for (int j = 0; j<9; j++){
for (int i = 0; i<9; i++) stamp[i] = 0;
for (int i = 0; i<9; i++){
if(isValidnum(board[i][j])){
if(stamp[board[i][j]-'1'] == 0) stamp[board[i][j]-'1'] = 1;
else return false;
}
}
}
return true;
}
bool isValidcube(vector<vector<char>> &board){
for(int m = 0; m<3; m++){
for(int k = 0; k<3; k++){
for (int i = 0; i<10; i++) stamp[i] = 0;
for(int i = m*3; i<(m+1)*3; i++){
for(int j = k*3; j<(k+1)*3; j++){
if(isValidnum(board[i][j])) {
if(stamp[board[i][j]-'1'] == 0) stamp[board[i][j]-'1'] = 1;
else return false;
}
}
}
}
}
return true;
}
bool isValidnum(char a){
if (a>'0'&&a<='9') return true;
else return false;
}
};