class Solution {
public:
bool queen(vector<string>&ans,int n,int x,int y){
for(int i=0;i<x;++i){
for(int j=0;j<n;++j){
if(ans[i][j]=='Q' && (j==y || abs(i-x)==abs(j-y))){//行已确定不考虑
//列相等或者对角线上(即行列坐标差值的绝对值相等)
return false;//不可以放置
}
}
}
return true;//可以放置
}
void dps(vector<vector<string>>&res,vector<string>&ans,int num,int n){
//只有num,标志递归的层数,同时作为不同行数这个限制条件
//其他既然不是全局变量,故也需要作为参数
if(num==n){//到达最后,解添加添加
res.emplace_back(ans);
return;
}
for(int i=0;i<n;++i){
if(queen(ans,n,num,i)){//num与i分别是可能的放置点的行列
ans[num][i]='Q';
dps(res,ans,num+1,n);
ans[num][i]='.';
}
}
return;
}
vector<vector<string>> solveNQueens(int n) {
//测试一下上课的效果(早八讲了n皇后问题,回溯法)
vector<vector<string>> res;
vector<string> ans(n, std::string(n, '.'));//注意这行,给ans赋初值的stl写法
dps(res,ans,0,n);
return res;
}
};
详情看代码内的注释就可以了。
或取诸怀抱,悟言一室之内;或因寄所托,放浪形骸之外。——《兰亭集序》
今天早八难得没睡着,认真听课(大概)
仿照记忆中上课讲的代码了。
不过有不同,本题我没有设置全局变量,所以递归的参数比较多。
另外,对于vector<string>的初始化,我也不太会。
其他问题不大,尤其写递归,
这几天做了好几道类似的回溯问题,大概掌握了吧。
回溯法本质上还是个暴力解法,只不过通过剪枝优化了一点点。
时间复杂度:O(n!)
空间复杂度:O(n)
tip:碎碎念。八皇后问题早在前年就看过了,只是当时连汉诺塔问题都看不明白,于是期末考试的递归也没写出来。
毫无疑问现在相比过去还是有进步的。嗯,所以不要自怨自艾,也不要失去信心了,我在前进,慢就慢一点,没关系啦。
希望未来的自己看到今天,2023年4月23日的自己,能开心一点吧。
感觉自己已经把CSDN当树洞了。