A: 回溯法解决,和八皇后一个思路。
用三个二维数组标记数字在行,列,block是否出现过。
vector> row; vector > col; vector > block; void solveSudoku(vector > &board) { // Start typing your C/C++ solution below // DO NOT write int main() function row.clear(); col.clear(); block.clear(); row.resize(9,vector (9,false)); col.resize(9,vector (9,false)); block.resize(9,vector (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 >& 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; }