递归搜索与回溯专题篇二

news2024/11/15 7:42:47

目录

N皇后

有效的数独

解数独

单词搜索

黄金矿工

不同路径III


N皇后

题目

思路

根据题意可知,要想得到n皇后的摆放方案,结果须满足每一行及每一列都只有一个皇后,且每个主对角线和副对角线上只能有一个皇后,我们的做法是,使用三个数组记录每一列,每一个主对角线以及每一个副对角线上是否有皇后,事先创建一个和原二维矩阵同规模大小的二维矩阵,每个位置都设置为'.',然后根据n皇后的规则,每一行每个位置的填放皇后的位置,填皇后时,先判断这一列,当前位置的主对角线和副对角线上是否有皇后,如果都没有的话,再填皇后,递归的出口是已经填放完最后一行皇后的位置。

代码

class Solution {
    bool checkCol[10],checkDig1[20],checkDig2[20];
    vector<vector<string>> ret;
    vector<string> path;

public:
    vector<vector<string>> solveNQueens(int n) {
        path.resize(n);
        for(int i=0;i<n;i++)
            path[i].append(n,'.');
        dfs(n,0);
        return ret;
    }

    void dfs(int n,int row){
        if(row==n){
            ret.push_back(path);
            return;
        }
        for(int col=0;col<n;col++){
            if(!checkCol[col] && !checkDig1[row-col+n] && !checkDig2[row+col]){
                path[row][col]='Q';
                checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col]=true;
                dfs(n,row+1);
                checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col]=false;
                path[row][col]='.';
            }
        }
    }
};
有效的数独

题目

思路

解决这道题并不会利用到递归和回溯,之所以放这道题是为了解决下一道题准备的,因为题目要求每一行每一列1~9每个数字只能出现一次,且1~9在每个3x3的宫格内只能出现一次。

那么该如何处理上面这3条规则那?使用一个数组row来记录每一行每个数字是否出现,使用一个数组col来记录每一列每个数字是否出现,使用一个数组grid来记录每个3x3的宫格内每个数字是否出现过,如果不满足上面的三个条件,说明不是数独;否则是数独。

代码

class Solution {
    bool row[9][10];
    bool col[9][10];
    bool grid[3][3][10];
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++){
                if(board[i][j]!='.'){
                    int num=board[i][j]-'0';
                    if(row[i][num] || col[j][num] || grid[i/3][j/3][num])
                        return false;
                    row[i][num]=col[j][num]=grid[i/3][j/3][num]=true;
                }
            }
        return true;
    }
};
解数独

题目

思路

如何理解数独,在上一道题已经理解过了,题目中值填写了部分位置的值,要求我们填写剩下的位置,使之满足数独,数独的条件是每一行每一列1~9每个数字只能出现一次,且1~9在每个3x3的宫格内只能出现一次。

那么该如何处理上面这3条规则那?和上一道题一样,使用一个数组row来记录每一行每个数字是否出现,使用一个数组col来记录每一列每个数字是否出现,使用一个数组grid来记录每个3x3的宫格内每个数字是否出现过,如果不满足上面的三个条件,说明不是数独;否则是数独。

填写每个空位置时先判断1~9的某个值是否已经在每一行每一列以及每一个3x3的宫格内出现过,如果没有出现过才填写,并递归填写剩下的位置。

代码

class Solution {
    bool row[9][10];
    bool col[9][10];
    bool grid[3][3][10];
public:
    void solveSudoku(vector<vector<char>>& board) {
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++){
                if(board[i][j]!='.'){
                    int num=board[i][j]-'0';
                    row[i][num]=col[j][num]=grid[i/3][j/3][num]=true;
                }
            }
        dfs(board);
    }

    bool dfs(vector<vector<char>>& board){
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++){
                if(board[i][j]=='.'){
                    //填数
                    for(int num=1;num<=9;num++){
                        if(!row[i][num] && !col[j][num] && !grid[i/3][j/3][num]){
                            board[i][j]=num+'0';
                            row[i][num]=col[j][num]=grid[i/3][j/3][num]=true;
                            if(dfs(board)) return true;
                            row[i][num]=col[j][num]=grid[i/3][j/3][num]=false;
                            board[i][j]='.';
                        }
                    }
                    return false;
                }
            }
        return true;
    }
};
单词搜索

题目

思路

解决这道题是使用DFS,先扫描原始二维矩阵中的每个位置,判断是否与字符串第一个位置的值相等,如果相等,则对该位置进行DFS,递归的出口是匹配完字符串的所有位置的字符。

代码

class Solution {
    int m,n;
    bool vis[6][6];
public:
    bool exist(vector<vector<char>>& grid, string word) {
        m=grid.size(),n=grid[0].size();
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==word[0])
                {
                    //  memset(vis, false, sizeof(vis)); // 重置 vis 数组
                    vis[i][j]=true;
                    if(dfs(grid,i,j,word,1)) return true;
                    vis[i][j]=false;
                }
            }
        return false;
    }

    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1};

    bool dfs(vector<vector<char>>& grid,int i,int j,string word,int pos){
        if(pos==word.size()) return true;
        for(int k=0;k<4;k++)
        {
            int x=i+dx[k];
            int y=j+dy[k];
            if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && grid[x][y]==word[pos]){
                vis[x][y]=true;
                if(dfs(grid,x,y,word,pos+1)) return true;
                vis[x][y]=false;
            }
        }
        return false;
    }
};
黄金矿工

题目

思路

解决这道题也是使用DFS来解决,扫描整个二维数组,判断每个位置的值是否不为0,如果不为0,则对该位置进行DFS,因为不能走已经走过的位置,因此需要使用一个二维矩阵来标记已经访问过的位置,没有递归出口,递归结束就是处理到不再能继续递归。

代码

class Solution {
    bool vis[16][16];
    int ret,m,n;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
public:
    int getMaximumGold(vector<vector<int>>& grid) {
        m=grid.size(),n=grid[0].size();
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(grid[i][j]){
                    vis[i][j]=true;
                    dfs(grid,i,j,grid[i][j]);
                    vis[i][j]=false;
                }
            }
        return ret;
    }

    void dfs(vector<vector<int>>& grid,int i,int j,int sum){
        ret=max(ret,sum);
        for(int k=0;k<4;k++){
            int x=i+dx[k],y=j+dy[k];
            if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && grid[x][y]){
                vis[x][y]=true;
                dfs(grid,x,y,sum+grid[x][y]);
                vis[x][y]=false;
            }
        }
    }
};
不同路径III

题目

思路

之前讲解过不同路径和不同路径II,都是使用动态规划来解决的,这道题之所以没有使用动态规划来解决是因为使用动态规划来解决这道题比较困难,下面将使用DFS来解决这道题。

首先扫描整个二维矩阵,计算出0的个数以及起始位置的坐标,然后从起始位置进行DFS,每走一步对步数进行++,直到步数等于原始二维矩阵0的个数+2(起始位置和结束位置),因为不能走已经走过的位置,因此需要使用一个二维矩阵来标记已经走过的位置。

代码

class Solution {
    bool vis[21][21];
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int m,n,ret,sum;
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        m=grid.size(),n=grid[0].size();
        int bx,by;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(grid[i][j]==1)
                    bx=i,by=j;
                else if(grid[i][j]==0)
                    sum++;
        sum+=2;
        vis[bx][by]=true;
        dfs(grid,bx,by,1);
        return ret;
    }

    void dfs(vector<vector<int>>& grid,int i,int j,int val){
        if(grid[i][j]==2){
            if(val==sum)
                ret++;
            return;
        }
        for(int k=0;k<4;k++){
            int x=i+dx[k],y=j+dy[k];
            if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && grid[x][y]!=-1){
                vis[x][y]=true;
                dfs(grid,x,y,val+1);
                vis[x][y]=false;
            }
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32单片机 定时器TIM输出比较 PWM波形

一. OC&#xff08;Output Compare&#xff09;输出比较 了解&#xff1a;IC&#xff08;Input Capture&#xff09;输入捕获、CC&#xff08;Capture/Compare&#xff09;输入捕获和输出比较单元功能&#xff1a;用来输出PWM波形&#xff0c;PWM波形又是用来驱动电机的必要条…

2008-2022年各省环境污染综合指数数据(含原始数据+计算结果)

2008-2022年各省环境污染综合指数数据&#xff08;含原始数据计算结果&#xff09; 1、时间&#xff1a;2008-2022年 2、来源&#xff1a;统计年鉴、各省年鉴、环境年鉴 3、指标&#xff1a;省份、年份、废水排放总量&#xff08;万吨&#xff09;、废气中二氧化硫排放量&am…

系统架构设计师 - 系统可靠性分析与设计

系统可靠性分析与设计 系统可靠性分析与设计&#xff08;论文写作&#xff09;可靠性相关基本概念 ★★系统可靠性分析 ★★★★可靠性指标串联系统与并联系统 软件可靠性设计 ★★★★影响软件可靠性的主要因素可靠性设计策略N 版本程序设计防卫式程序设计 双击容错 大家好呀&…

公共场所团队管理-手机端源码讲解--SAAS本地化及未来之窗行业应用跨平台架构

一、团队自主注册码 二、代码 var 二维码 "未来之窗?url"encodeURIComponent(url);var 图片 "<img src"二维码">";CyberWin_Dialog.layer(图片,{type:"frame",title:title,width:"320px",height:"320px"…

从阅读到编辑,全方位PDF编辑器软件功能探索

你现在收到的文件是不是大部分也都是PDF格式的&#xff1f;这个格式可以完整的保存任意Office软件制作文档的格式&#xff0c;但是编辑起来就不是那么方便了。这次我汇集了一些我和身边小伙伴常用的类似福昕高级pdf编辑器这样的编辑工具统统分享给你吧。 1.福昕PDF编辑器 链接…

蚁剑webshell连接报错A JavaScript error occurred in the main process

报错如图&#xff1a; 已知解决方式&#xff1a; 将上传shell中文文件名修改为任意的英文文件名即可连接。

数据库体系结构概述

文章目录 1、集中式数据库2、分布式数据库2.1、体系结构2.2、特性2.3、分片方式2.4、透明性2.5、两阶段提交协议 2PC 1、集中式数据库 三级模式 外模式: 也称用户模式&#xff0c;对应 用户视图模式&#xff08;概念模式&#xff09;: 对应数据库表&#xff08;关系表&#xff…

读软件设计的要素06概念完整性

1. 概念完整性 1.1. 当概念组合成一个软件时&#xff0c;它们可以同步以便协调行为 1.1.1. 同步可能会消除一个概念的某些行为&#xff0c;但决不会添加与该概念的规范不一致的新行为 1.1.2. 在使用概念设计软件时&#xff0c;即使你没有精确定义同步&#xff0c;至少要说服自…

二进制方式安装Helm

二进制方式安装Helm 官网&#xff1a;https://helm.sh/ 1、下载安装包 wget -L https://get.helm.sh/helm-v3.16.0-rc.1-linux-amd64.tar.gz2、解压 tar -xf helm-v3.16.0-rc.1-linux-amd64.tar.gz3、移动到/usr/local/bin/目录下 mv linux-amd64/helm /usr/local/bin/he…

ResNet结构图(ResNet18、ResNet50)

原理&#xff1a;利用conv将通道数逐渐增加&#xff0c; 图片尺寸逐渐缩小 ResNet18结构图 ResNet18中的"18"指的是网络中的加权层数量。具体来说&#xff0c;它包含了18个卷积层和全连接层。 ResNet18的架构包括&#xff1a; 1个7x7卷积层16个3x3卷积层&#xf…

echarts饼图

const payload {id: left-center-1,title: 年龄占比,toolTip: true,data: {total: 197,data: [1, 32, 57, 67, 40],x: [35岁以下, 35-40岁, 40-45岁, 45-50岁, 50岁以上],}, };data [];// const color [#2F7DF2, #F9CA3C, #2E5CF2, #34E9A3, #F63048, #F97A3C, #2FD9F2, #A9…

IOS 开发者账号注册流程

注册步骤 准备资料 营业执照 法人信息&#xff08;电话、身份证信息&#xff09; 注册邮箱&#xff08;公司邮箱&#xff09; 开发者信息&#xff08;电话、身份证信息、邮箱&#xff09;1. 注册AppleID 注册地址&#xff1a; https://appleid.apple.com/account 填写表单信…

杂谈|压力管理之认识「压力」(一)

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、腾讯云TDP-KOL、ACDU成员、墨天轮技术专家博主 &#x1f52…

曾经的王者-腾讯公众号为什么不火了呢?

微信公众号&#xff0c;曾经是图文内容创作者的天堂&#xff0c;如今却似乎风光不再。随着短视频和直播等新型媒体形式的崛起&#xff0c;公众号的打开率连年下滑&#xff0c;粉丝负增长甚至成为一些账号的常态。为何曾一度被誉为“图文类博主巅峰”的公众号会陷入如此境地&…

中国碳排放交易试点城市名单DID(2000-2022年)

中国碳排放交易试点城市名单DID数据是一个重要的工具&#xff0c;用于研究中国碳排放交易试点政策的影响。这些数据通常包括了各个试点城市在政策实施前后的虚拟变量&#xff0c;可以用于计量经济学分析&#xff0c;如双重差分&#xff08;DID&#xff09;方法&#xff0c;以评…

自学半年LabVIEW,能搭建出来一个系统吗

自学半年 LabVIEW 是完全有可能搭建出一个系统的&#xff0c;具体取决于你的学习效率、项目的复杂性以及你投入的时间。以下一些内容&#xff0c;能帮助你评估在半年时间内是否可以搭建出一个功能完善的系统&#xff1a; 1. 学习基础和背景 如果你已经具备编程或工程背景&…

服务器深度学习环境配置

学校提供的服务器&#xff0c;参考意见比较低 目录 公有云操作云主机操作系统修改&#xff1a; xshell连接深度学习环境配置显卡驱动检查安装检查 CUDA检查CUDA下载配置环境变量检查 conda 公有云操作 打开控制中心 节点选择 山东-青岛20 打开弹性云主机 云主机 系统已经默认…

Flutter类

Dart中的对象都继承自 Object 类&#xff0c;单继承&#xff08;extend关键字&#xff09;。Dart与Java、kotlin不同的是其无public、private、protected修饰符&#xff0c;默认public &#xff0c;通过在属性名、方法名前加 _下划线 来定义是否私有。 实现一个简单的类 class…

Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)

&#x1f3af;要点 &#x1f3af;受激发射损耗显微镜算法模型&#xff1a;&#x1f58a;恢复嘈杂二维和三维图像 | &#x1f58a;模型架构&#xff1a;恢复上下文信息和超分辨率图像 | &#x1f58a;使用嘈杂和高信噪比的图像训练模型 | &#x1f58a;准备半合成训练集 | &…

基于单片机的水产养殖饲料自动投喂系统

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图系统框架图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机…