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.rhkb.cn/news/297922.html

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

相关文章

【C++】vector问题解决(非法的间接寻址,迭代器失效 , memcpy拷贝问题)

送给大家一句话&#xff1a; 世界在旋转&#xff0c;我们跌跌撞撞前进&#xff0c;这就够了 —— 阿贝尔 加缪 vector问题解决 1 前言2 迭代器区间拷贝3 迭代器失效问题4 memcpy拷贝问题 1 前言 我们之前实现了手搓vector&#xff0c;但是当时依然有些问题没有解决&#xff…

【Java笔记】多线程0:JVM线程是用户态还是内核态?Java 线程与OS线程的联系

文章目录 JVM线程是用户态线程还是内核态线程什么是用户态线程与内核态线程绿色线程绿色线程的缺点 线程映射稍微回顾下线程映射模型JVM线程映射 线程状态操作系统的线程状态JVM的线程状态JVM线程与OS线程的状态关系 Reference 今天复盘一下Java中&#xff0c;JVM线程与实际操作…

使用虚拟引擎为AR体验提供动力

Powering AR Experiences with Unreal Engine ​​​​​​​ 目录 1. 虚拟引擎概述 2. 虚拟引擎如何为AR体验提供动力 3. 虚拟引擎中AR体验的组成部分是什么&#xff1f; 4. 使用虚拟引擎创建AR体验 5. 虚拟引擎中AR的优化提示 6. 将互动性融入AR与虚拟引擎 7. 在AR中…

简述JMeter实现分布式并发及操作

为什么要分布式并发&#xff1f; JMeter性能实践过程中&#xff0c;一旦进行高并发操作时就会出现以下尴尬场景&#xff0c;JMeter客户端卡死、请求错误或是超时等&#xff0c;导致很难得出准确的性能测试结论。 目前知道的有两个方法可以解决JMeter支撑高并发&#xff1a; …

【Android Studio】上位机-安卓系统手机-蓝牙调试助手

【Android Studio】上位机-安卓系统手机-蓝牙调试助手 文章目录 前言AS官网一、手机配置二、移植工程三、配置四、BUG五、Java语言总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 AS官网 AS官网 一、手机配置 Android Studio 下真机调试 …

Rust egui(4) 增加自己的tab页面

如下图&#xff0c;增加一个Sins也面&#xff0c;里面添加一个配置组为Sin Paraemters&#xff0c;里面包含一个nums的参数&#xff0c;范围是1-1024&#xff0c;根据nums的数量&#xff0c;在Panel中画sin函数的line。 demo见&#xff1a;https://crazyskady.github.io/index.…

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲&#xff0c;SpringBoot 在Spring生态基础上发展而来&#xff0c;它的发现不是取代Spring&#xff0c;是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

ENSP中AC登录web界面

拓扑 虚拟网卡配置 云团配置&#xff1a; **AC配置** vlan batch 100 # interface GigabitEthernet0/0/1port link-type accessport default vlan 100 # interface Vlanif100ip address 192.168.0.1 255.255.255.0 #http server enable浏览器输入&#xff1a;http://192.168.…

前端 - 基础 表单标签 - 表单元素 input - type 属性 ( 单选按钮和复选按钮 )

input 标签 type 属性 &#xff0c;上一篇讲了 输入框 和 密码框 这节看看 单选按钮 和 复选 按钮 目录 单选按钮 &#xff1a; 复选按钮 # 看上图就可以看到 单选按钮 -- radio 和 复选 按钮 -- checkbox 单选按钮 &#xff1a; 所谓单选按钮就是 有时…

某音乐平台歌曲信息逆向之参数寻找

如何逆向加密参数&#xff1a;某音乐平台歌曲信息逆向之webpack扣取-CSDN博客 参数构建 {"comm": {"cv": 4747474,"ct": 24,"format": "json","inCharset": "utf-8","outCharset": "ut…

HTML:框架

案例&#xff1a; <frameset cols"5%,*" ><frame src"left_frame.html"><frame src"right_frame.html"> </frameset> 一、<frameset>标签 <frameset>标签&#xff1a;称为框架标记&#xff0c;将一个HTML…

动态规划详解(Dynamic Programming)

目录 引入什么是动态规划&#xff1f;动态规划的特点解题办法解题套路框架举例说明斐波那契数列题目描述解题思路方式一&#xff1a;暴力求解思考 方式二&#xff1a;带备忘录的递归解法方式三&#xff1a;动态规划 推荐练手题目 引入 动态规划问题&#xff08;Dynamic Progra…

基于SpringBoot的“数码论坛系统设计与实现”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“数码论坛系统设计与实现”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面图 数码板…

一次java.lang.NullPointerException的排查之旅

一次java.lang.NullPointerException的排查之旅 问题由来问题分析问题处理 问题由来 最近在项目中遇到了一个比较奇怪的java.lang.NullPointerException&#xff0c;就是说在自己的本地环境中&#xff0c;功能正常&#xff0c;运行无异常。但是测试环境点击同样的功能时却总是…

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构&#xff1a;综合指南 前言一、什么是 Kubernetes 架构&#xff1f;1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 &#xff08;CCM&#xff09; 三…

CAD Plant3D 2023 下载地址及安装教程

CAD Plant3D是一款专业的三维工厂设计软件&#xff0c;用于在工业设备和管道设计领域进行建模和绘图。它是Autodesk公司旗下的AutoCAD系列产品之一&#xff0c;专门针对工艺、石油、化工、电力等行业的设计和工程项目。 CAD Plant3D提供了一套丰富的工具和功能&#xff0c;帮助…

matlab中角度-弧度转化

在 MATLAB 中进行角度和弧度之间的转换可以使用内置的函数&#xff1a; 1. 将角度转换为弧度&#xff1a; matlab rad deg * pi / 180; 这里 deg 是你想要转换的角度值&#xff0c;pi 是 MATLAB 内置的圆周率常量。 2. 将弧度转换为角度&#xff1a; matlab…

基于springboot+vue+Mysql的大学生租房系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

SambaNova 芯片:深入解析其架构和高性能秘诀

SambaNova——一家总部位于帕洛阿尔托的公司已经筹集了超过10亿美元的风险投资&#xff0c;不会直接向公司出售芯片。相反&#xff0c;它出售其定制技术堆栈的访问权限&#xff0c;该堆栈具有专门为运行最大的人工智能模型而设计的专有硬件和软件。 最近&#xff0c;SambaNova…

挖一挖:PostgreSQL Java里的double类型存储到varchar精度丢失问题

前言 大概故事是这样的&#xff0c;PostgreSQL数据库&#xff0c;表结构&#xff1a; create table t1(a varchar);然后使用标准的Java jdbc去插入数据&#xff0c;其基本代码如下&#xff1a; import java.sql.*; public class PgDoubleTest {public static void main(Stri…