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.
弄清楚数独的规则,就很简单。
代码如下:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
unordered_map<char,int> map;
unordered_map<char,int> hash[3][3];
int num = board.size();
for(int i=0;i<num;i++)
{
map.clear();
for(int j =0;j<board[i].size();j++)
{
if(board[i][j] != '.')
{
if(map[board[i][j]] ==1 )
return false;
else
map[board[i][j]]++;
if(hash[i/3][j/3][board[i][j]] == 1)
return false;
else
hash[i/3][j/3][board[i][j]]++;
}
}
map.clear();
for(int j=0;j<board[i].size();j++)
{
if(board[j][i] != '.')
{
if(map[board[j][i]] == 1)
return false;
else
map[board[j][i]]++;
}
}
}
return true;
}
};
发现运行的效率并不是很好,想办法进行优化。
首先是数据结构上可以采用位图来代替unorder_map,因为数独的规格就是9*9,所以可以想办法在逻辑上对代码进行简化
代码如下:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector<short> row(9,0),col(9,0);
vector<short> sub(9,0);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
short idx = 1 << (board[i][j] - '0');
if((row[i] & idx) || (col[j] & idx) || (sub[i/3*3+j/3] & idx))
return false;
row[i] = row[i] | idx;
col[j] = col[j] | idx;
sub[i/3*3+j/3] = sub[i/3*3+j/3] | idx;
}
}
return true;
}
};