leetcode51:n皇后问题:回溯法解决

文章详细介绍了使用C++编程解决N皇后问题的回溯法策略,包括关键函数`queen`和`dps`的实现,以及递归过程中参数的使用。作者强调了回溯法的本质是暴力解法但通过剪枝优化,同时分享了个人学习编程的进步和感悟。
摘要由CSDN通过智能技术生成
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当树洞了。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值