Sudoku Solver
A: 回溯法解决,和八皇后一个思路。
用三个二维数组标记数字在行,列,block是否出现过。
vector<vector<bool>> row;
vector<vector<bool>> col;
vector<vector<bool>> block;
void solveSudoku(vector<vector<char> > &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
row.clear();
col.clear();
block.clear();
row.resize(9,vector<bool>(9,false));
col.resize(9,vector<bool>(9,false));
block.resize(9,vector<bool>(9,false));
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(board[i][j]=='.')
continue;
int num = board[i][j]-'1';
row[i][num] = col[j][num] = block[(i/3)*3+j/3][num] = true;
}
}
dfs(0,board);
}
bool dfs(int pos,vector<vector<char>>& board)
{
while(pos<81&&board[pos/9][pos%9]!='.')
{
pos++;
}
if(pos==81) return true;
int i = pos/9,j=pos%9;
for(int num=0;num<9;num++)
{
if(!row[i][num]&&!col[j][num]&&!block[(i/3)*3+j/3][num])
{
row[i][num] = col[j][num] = block[(i/3)*3+j/3][num] = true;
board[i][j] = num+'1';
if(dfs(pos+1,board))
return true;
board[i][j] = '.';
row[i][num] = col[j][num] = block[(i/3)*3+j/3][num] = false;
}
}
return false;
}
浙公网安备 33010602011771号