【Leetcode棋盘问题】51.N 皇后(一维递归) 37. 解数独(二维递归) 79. 单词搜索(二维递归)



51皇后问题和37解数独对比总结

非常重要的理解就是皇后问题是一维递归,而数独问题是二维递归!

在这里插入图片描述
在这里插入图片描述



Leetcode51

1.问题描述

在这里插入图片描述

2.解决方案

整体思路代码sxl上有,这只做几点强调:

1.vector<vector< string > > ans存放结果相当于存放了多个棋盘
2.回溯函数中的参数vector< string > chessboard,是记录目前为止棋盘的信息
3.因为for中会进行合法检测,所以如果layer==n,说明一定是一个结果集,所以直接收集
4.递归深度和每一层for的宽度都是n
5.合法检测中,没有同行的检测因为for只会在同一行选择一个

代码实现总结:

1.最初的棋盘需要初始化(一种错误的和两种正确的)

//错误二:理解错误,新建一个vector是空的而不像新建一个二维数组不是空的只是其中的元素没有初始化,这个干脆就是空的
//vector<string> chessboard; //感觉不用初始化

//必须初始化一:
string s;
for(int i=0;i<n;i++) s.push_back('.');
vector<string> chessboard(n,s);

//必须初始化二:
vector<string> chessboard1(n,string(n,'.'));

2.for里面定义两个循环变量其中的约束条件不能是逗号,得是&&

//错误一:
//for(int i=layer-1,j=col-1;i>=0,j>=0;i--,j--){
   
for(int i=layer-1,j=col-1;i>=0&&j>=0;i--,j--)



在这里插入图片描述

class Solution {
   
public:
    vector<vector<string> > ans;
    void backtracking(int n,int layer,vector<string> chessboard){
   
        if(layer==n) {
   
            ans.push_back(chessboard);
            return;
        }

        for(int col=0;col<n;col++){
   
            if(isValid(n,layer,col,chessboard)== false) continue;
            chessboard[layer][col]='Q';
            backtracking(n,layer+1,chessboard);
            chessboard[layer][col]='.';
        }
    }
    bool isValid(int n,int layer,int col,vector<string> chessboard){
   
        //同行不用去重
        //同列去重
        for(int i=0;i<layer;i++
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值