题目:
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.
题解:
Solution 1
class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { const int n = 9; for(int i = 0; i < n; ++i){ bool used[n] = {false}; for(int j = 0; j < n; ++j){ if(isused(board[i][j], used)) return false; } } for(int i = 0; i < n; ++i){ bool used[n] = {false}; for(int j = 0; j < n; ++j){ if(isused(board[j][i], used)) return false; } } for(int r = 0; r < 3; ++r){ for(int c = 0; c < 3; ++c){ bool used[n] = {false}; for(int i = r * 3; i < r * 3 + 3; ++i){ for(int j = c * 3; j < c * 3 + 3; ++j){ if(isused(board[i][j], used)) return false; } } } } return true; } bool isused(char val, bool used[9]){ if(val == '.') return false; if(used[val - '1']) return true; used[val - '1'] = true; return false; } };
Solution 2
class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { const int n = 9; vector<vector<bool>> rowboard(n, vector<bool>(n, false)); vector<vector<bool>> colboard(n, vector<bool>(n, false)); vector<vector<bool>> celboard(n, vector<bool>(n, false)); for(int i = 0; i < n; ++i){ for(int j = 0; j < n; ++j){ if(board[i][j] == '.') continue; int ch = board[i][j] - '1'; if(rowboard[i][ch] || colboard[ch][j] || celboard[3 * (i / 3) + j / 3][ch]) return false; rowboard[i][ch] = true; colboard[ch][j] = true; celboard[3 * (i / 3) + j / 3][ch] = true; } } return true; } };