问题描述:
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.
问题分析:
判断数独是否有效,不要求求解。
创建一个二维数组存储,只要同一行、列和块没有元素没有相同的元素即可。
问题求解:
bool isValidSudoku(vector<vector<char>>& board) {
vector<short> col(9, 0);
vector<short> block(9, 0);
vector<short> row(9, 0);
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
int idx = 1 << (board[i][j] - '0');
if (row[i] & idx || col[j] & idx || block[i/3 * 3 + j / 3] & idx)
return false;
row[i] |= idx;
col[j] |= idx;
block[i/3 * 3 + j/3] |= idx;
}
}
return true;
}
第二遍:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector<unordered_set<char>> rows(9), cols(9), grid(9);
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
if(rows[i].find(board[i][j]) != rows[i].end())
{
return false;
}else{
rows[i].insert(board[i][j]);
}
if(cols[j].find(board[i][j]) != rows[j].end())
{
return false;
}else{
cols[j].insert(board[i][j]);
}
int n = i-i%3+j/3;
if(grid[n].find(board[i][j]) != grid[n].end())
{
return false;
}else{
grid[n].insert(board[i][j]);
}
}
}
}
return true;
}
};
这次用hash set求解,关键是行列和网格要选合适的数据结构表示,还有n= i-i%3+j/3。从该题了解了我对STL掌握不是很好,接下来要好好总结。