这是经典的题目,但是写的很痛苦。大致思路是容易得到的,难在细节以及把递归思路想清楚。
教训:
(1)在要求所有解的DFS中,不要在得到一个解时把中间状态清0,不要受回溯思想的影响;这里的memo不用恢复的原因是下次计算自然就把当前的memo覆盖了,当然你去恢复也没有错。
(2)一路改BUG写完的程序,不是真正的写完,说明你没有真正想清楚,下次再写还会犯同样的错误。与其下次再犯,不如这次仔细反省,仔细检查思路为什么会出现这样的bug。
class Solution {
public:
void solve(vector<vector<string> > &result,vector<string> &oneAns, int *memo ,int r,int size){
if(r==size) {
for(int i=0;i<size;++i)
oneAns[i][memo[i]]='Q';
result.push_back(oneAns);
for(int i=0;i<size;++i)
oneAns[i][memo[i]]='.';// if meme[i]=-1, then will get the wrong answer!
}
int col,row;
for(col=0;col<size;++col){
for(row=0;row<r;++row)
if(col==memo[row] or abs(r-row)==abs(col-memo[row])) break;
if(row==r) {
memo[r]=col;
solve(result,oneAns,memo,r+1,size);
memo[r]=-1;// Actually you don't need do this
}
}
}
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> > result;
if(n==0) return result;
int *memo = new int[n];
memset(memo,-1,n*sizeof(int));
string rs(n,'.');
vector<string> oneAns(n,rs);
solve(result,oneAns,memo,0,n);
return result;
}
};