DFS:深搜+回溯+剪枝解决矩阵搜索问题

                                               创作不易,感谢三连!! 

一、N皇后

. - 力扣(LeetCode)

class Solution {
public:vector<vector<string>> ret;vector<string> path;bool checkcol[9];bool checkdig1[18];bool checkdig2[18];int n;vector<vector<string>> solveNQueens(int _n) {n=_n;path.resize(n);for(int i=0;i<n;++i)  path[i].append(n,'.');//先全部初始化成.dfs(0);return ret;}void dfs(int row){if(row==n) {ret.push_back(path);return;}for(int col=0;col<n;++col)//枚举每一行的每个元素{if(checkcol[col]==false&&checkdig1[n+row-col]==false&&checkdig2[row+col]==false)//n+row-col防止越界{path[row][col]='Q';checkcol[col]=checkdig1[n+row-col]=checkdig2[row+col]=true;dfs(row+1);//恢复现场path[row][col]='.';checkcol[col]=checkdig1[n+row-col]=checkdig2[row+col]=false;}}}
};

二、有效的数独

. - 力扣(LeetCode)

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

三、解数独

. - 力扣(LeetCode)

class Solution {
public:bool checkrow[9][10];bool checkcol[9][10];bool checkgrid[3][3][10];void solveSudoku(vector<vector<char>>& board) {//初始化for(int row=0;row<9;++row)for(int col=0;col<9;++col){if(board[row][col]!='.'){int num=board[row][col]-'0';checkrow[row][num]=checkcol[col][num]=checkgrid[row/3][col/3][num]=true;}}dfs(board);}bool dfs(vector<vector<char>> &board)//bool用来告诉上一层决策是正确的{for(int row=0;row<9;++row)for(int col=0;col<9;++col){if(board[row][col]=='.'){//开始尝试填数for(int num=1;num<=9;++num){if(!checkrow[row][num]&&!checkcol[col][num]&&!checkgrid[row/3][col/3][num]){//说明能填,就填上board[row][col]=num+'0';checkrow[row][num]=checkcol[col][num]=checkgrid[row/3][col/3][num]=true;if(dfs(board)) return true;//去下一个位置填,如果填成功了,返回true//恢复现场board[row][col]='.';checkrow[row][num]=checkcol[col][num]=checkgrid[row/3][col/3][num]=false;}}return false;//1-9没有一个数能填,说明决策错误}}return true;//安全地填完了,返回true}
};

四、单词搜索

. - 力扣(LeetCode)

class Solution {
public:bool check[6][6];//用来标记选过的位置int m,n;vector<vector<char>> board;string word;bool exist(vector<vector<char>>& _board, string _word) {board=_board;word=_word;m=board.size();n=board[0].size();for(int i=0;i<m;++i)for(int j=0;j<n;++j){if(board[i][j]==word[0]){check[i][j]=true;if(dfs(i,j,1))  return true;check[i][j]=false;}}return false;}//用向量的方式来定义int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0}; //就可以将4个方向改变成一个for循环bool dfs(int i,int j,int pos){if(pos==word.size())  return true;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&&check[x][y]==false&&board[x][y]==word[pos]){check[x][y]=true;if(dfs(x,y,pos+1)) return true;check[x][y]=false;}}return false;//如果四个方向都找不到,说明确实没有可填的数,直接返回}
};

五、黄金旷工

. - 力扣(LeetCode)

class Solution {
public:int ret=0;bool check[15][15];int m,n;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]){check[i][j]=true;dfs(grid,i,j,grid[i][j]);check[i][j]=false;}}return ret;}//用向量的方式来定义int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0}; //就可以将4个方向改变成一个for循环void dfs(vector<vector<int>>& grid,int i,int j,int count){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&&!check[x][y]&&grid[x][y]){check[x][y]=true;dfs(grid,x,y,count+grid[x][y]);check[x][y]=false;}}ret=max(count,ret);//for循环结束,确实没得填了,更新}
};

六、不同路径III

. - 力扣(LeetCode)

class Solution {
public:int ret;bool check[20][20];//用来标记int m,n,step;//step用来统计可以走的方格个数int uniquePathsIII(vector<vector<int>>& grid) {ret=0;m=grid.size();n=grid[0].size();step=0;int bx=0,by=0;//记录起点//先找起点for(int i=0;i<m;++i)for(int j=0;j<n;++j){if(grid[i][j]==0) ++step;else if(grid[i][j]==1) {bx=i;by=j;}}step+=2;//把起点和终点算上,最后走到终点的时候就可以返回了check[bx][by]=true;dfs(grid,bx,by,1);return ret;}int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0}; //就可以将4个方向改变成一个for循环void dfs(vector<vector<int>>& grid,int i,int j,int count){if(grid[i][j]==2&&count==step) {++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&&!check[x][y]&&grid[x][y]!=-1){check[i][j]=true;dfs(grid,x,y,count+1);check[i][j]=false;}}}
};

七、小总结

1、矩阵搜索问题经常要用到向量,也就是我们可以通过dx和dy来帮助我们定义方向

2、矩阵搜索要确保走过的位置不再走过,所以此时有两个策略:

(1)标记数组,比较常用

(2)修改原矩阵的内容,但是这样做的话要我们要确保最后能够把它复原 

3、dfs的返回值不一定是void,如果该题目并不只是完全地去统计,而是涉及到我们做出的选择可能会错误的时候,这个时候我们就需要通过bool类型的返回值来帮助我们判断当前的填法是否正确。比如解数独和单词搜索问题

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

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

相关文章

WordPress主题–Applay v3.7.1 开心版下载

Applay是一款功能强大的多用途WordPress主题&#xff0c;专为应用展示、应用商店、商业和购物等Woocommerce网站而设计。它配备了拖曳式页面编辑功能&#xff0c;类似于Elementor&#xff0c;让您能够轻松构建和定制您的网站。无论您有什么需求&#xff0c;都可以尝试下这个主题…

Flutter 画笔(Paint)、绘制直线(drawLine)

override bool shouldRepaint(CustomPainter oldDelegate) > true; } class MyPainter extends CustomPainter { override void paint(Canvas canvas, Size size) { //画背景 var paint Paint() …isAntiAlias false …strokeWidth30.0 …color Colors.red; c…

金融贷款批准预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 在金融服务行业&#xff0c;贷款审批是一项关键任务&#xff0c;它不仅关系到资金的安全&#xff0c;还直接影响到金融机构的运营效率和风险管理…

8000预算可以购买阿里云服务器配置整理

一个月8000元预算如何选择阿里云服务器配置&#xff1f;八千预算可选的阿里云服务器配置相当高了&#xff0c;这个预算可以购买阿里云企业级独享型云服务器&#xff0c;至少8核以上的配置&#xff0c;这个预算可以支持复杂、高负载或大规模的业务需求。阿里云服务器网整理8000元…

微信小程序python+uniapp高校图书馆图书借阅管理系统ljr9i

根据日常实际需要&#xff0c;一方面需要在系统中实现基础信息的管理&#xff0c;同时还需要结合实际情况的需要&#xff0c;提供图书信息管理功能&#xff0c;方便图书管理工作的展开&#xff0c;综合考虑&#xff0c;本套系统应该满足如下要求&#xff1a; 首先&#xff0c;在…

C之结构体初始化10种写法总结(九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

基于Java微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Spring Boot 整合 RabbitMQ 实现延迟消息

关于 RabbitMQ 消息队列&#xff08;Message Queuing&#xff0c;简写为 MQ&#xff09;最初是为了解决金融行业的特定业务需求而产生的。慢慢的&#xff0c;MQ 被应用到了更多的领域&#xff0c;然而商业 MQ 高昂的价格让很多初创公司望而却步&#xff0c;于是 AMQP&#xff0…

网络基础二——传输层协议UDP与TCP

九、传输层协议 ​ 传输层协议有UDP协议、TCP协议等&#xff1b; ​ 两个远端机器通过使用"源IP"&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”&#xff0c;"协议号"来标识一次通信&#xff1b; 9.1端口号的划分 ​ 0-10…

2024年腾讯云4核8G服务器性能可以满足哪些使用场景?

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

【Redis】分布式锁及其他常见问题

分布式锁及其他常见问题 1. 我看你的项目都用到了 Redis&#xff0c;你在最近的项目的哪些场景下用到了 Redis 呢&#xff1f; 一定要结合业务场景来回答问题&#xff01;要是没有不要硬讲&#xff0c;除非面试官问&#xff1b; 接下来面试官将深入发问。 你没用到的也可能会…

【opencv】教程代码 —video(2) optical_flow (稀疏光流、稠密光流)

1. optical_flow.cpp 稀疏光流 #include <iostream> // 引入输入输出流库 #include <opencv2/core.hpp> // 引入OpenCV的核心功能模块 #include <opencv2/highgui.hpp> // 引入OpenCV的高级GUI模块&#xff0c;提供显示图像的功能 #include <opencv2/imgp…

Python | NCL风格 | EOF | 相关 | 回归

这里在linux系统上使用geocat实现NCL风格的图片绘制 geocat Linux上安装 geocat conda update condaconda create -n geocat -c conda-forge geocat-vizconda activate geocatconda update geocat-viz Dataset - NOAA Optimum Interpolation (OI) SST V2 # 海温月平均数据- lsm…

C++核心高级编程 --- 4.类和对象

文章目录 第四章&#xff1a;4.类和对象4.1 封装4.1.1 封装的意义4.1.2 struct与class的区别 4.2 对象的初始化和清理4.2.1 构造函数和析构函数4.2.2 构造函数的分类及调用4.2.3 拷贝构造函数调用时机4.2.4 构造函数调用规则4.2.5 深拷贝与浅拷贝4.2.6 初始化列表4.2.7 类对象作…

基础之重蹈覆辙

MESI缓存一致性协议 前&#x1f33d;&#xff1a; 高速缓存底层数据结构&#xff1a;拉链散列表的结构 bucket - cache entry - tag主内存地址 cache line缓存数据 flag缓存行状态 cache line64字节 有效引用主内存地址&#xff0c;连续的相邻的数据结构 读取特别快 处理器…

关于Tomcat双击startup.bat 闪退的解决⽅法

详解Tomcat双击startup.bat 闪退的解决⽅法 作为⼀个刚学习Tomcat的程序猿来说&#xff0c;这是会经常出现的错误。 1.环境变量问题 1.1 ⾸先需要确认java环境是否配置正确&#xff0c;jdk是否安装正确 winR打开cmd&#xff0c;输⼊java 或者 javac 出现下图所⽰就说明jdk配置正…

spark-hive连接操作流程、踩坑及解决方法

文章目录 1 简介2 版本匹配3 spark hive支持版本源码编译3.1 spark-src下载3.2 maven换源3.3 spark编译 4 hive 安装与mysql-metastore配置4.1 mysql下载安装4.1.1 为mysql设置系统环境变量4.1.2 初次登陆更改root身份密码4.1.3 安装后直接更改密码 4.2 hive初始化4.2.1 编写hi…

pycharm pyspark连接虚拟机的hive表 读取数据

方法&#xff1a; hive配置hiveserver2和metastore url <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bind.host</name><value>hadoop111</value> </property><!-- 指定hiveserver2连接的端口号 -…

langchain + azure chatgpt组合配置并运行

首先默认你已经有了azure的账号。 最重要的是选择gpt-35-turbo-instruct模型、api_version&#xff1a;2023-05-15&#xff0c;就这两个参数谷歌我尝试了很久才成功。 我们打开https://portal.azure.com/#home&#xff0c;点击更多服务&#xff1a; 我们点击Azure OpenAI&#…

华为ensp中ospf多区域管理 原理及配置命令(详解)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; ————前言———— OSPF 多区域的主要作用是缩小链路状态数据库和路由表的规模&#xff0c;减少路由更新的频率&#xff0c;提高网络的可扩展性&#xff0c;实现路由过滤和路由汇总&#xff0…