36、 有效的数独
36.1 题目
36.2 分析
36.3 代码
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
unordered_set<char> row={};
unordered_set<char> cloumn;
unordered_set<char> grid;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]!='.'&& !row.insert(board[i][j]).second){
return false;
}
if(board[j][i]!='.'&& !cloumn.insert(board[j][i]).second) return false;
if(board[i%3*3+j/3][i/3*3+j%3]!='.'&& !grid.insert(board[i%3*3+j/3][i/3*3+j%3]).second)
return false;
}
row.clear();
cloumn.clear();
grid.clear();
}
return true;
}
};
37、 解数独
37.1 题目
37.2 分析
37.3 代码
class Solution {
private:
int line[9];
int column[9];
int block[3][3];
vector<pair<int,int>> spaces;
bool valid;
public:
void flip(int i,int j,int digit){
line[i]^=1<<digit;
column[j]^=1<<digit;
block[i/3][j/3]^=1<<digit;
}
void dfs(vector<vector<char>>& board,int pos){
if(pos==spaces.size()){
valid=true;
return;
}
auto[i,j]=spaces[pos];
int mask=~(line[i] | column[j] |block[i/3][j/3])& 0x1ff;
for(;mask>0&&!valid;mask&=(mask-1)){
int lowmask=mask&(-mask);
int digit=__builtin_ctz(lowmask);
board[i][j]='0'+digit+1;
flip(i,j,digit);
dfs(board,pos+1);
flip(i,j,digit);
}
}
void solveSudoku(vector<vector<char>>& board) {
memset(line,0,sizeof(line));
memset(column,0,sizeof(column));
memset(block,0,sizeof(block));
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]=='.'){
spaces.emplace_back(i,j);
}else{
int digit=board[i][j]-'0'-1;
flip(i,j,digit);
}
}
}
dfs(board,0);
}
};