DFS 算法:洛谷B3625迷宫寻路

B3625 迷宫寻路 机器猫被困在一个矩形迷宫里。迷宫可以视为一个n×m矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。机器猫初始时位于11的位置,问能否走到nm位置。 阅读详情

在这里插入图片描述

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页

往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章


此系列更新频繁,求各位读者点赞
关注我可以了解更多内容哦
偷偷告诉你,我正在冲 1100 粉 {\color{Gray} {\small 偷偷告诉你,我正在冲1100粉} } 偷偷告诉你,我正在冲1100粉
你们有什么想了解的可以发在评论区,我会仔细的看 {\color{Gray} {\small 你们有什么想了解的可以发在评论区,我会仔细的看} } 你们有什么想了解的可以发在评论区,我会仔细的看
1100 粉时我会抓几个做文章 {\color{Gray} {\small1100粉时我会抓几个做文章} } 1100粉时我会抓几个做文章


今天我们学什么

今天我们不学什么,就是做一道二维DFS的题目

例题

我们选用了洛谷题目:B3625 迷宫寻路

题目描述

机器猫被困在一个矩形迷宫里。

迷宫可以视为一个 n × m n\times m n×m 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。

机器猫初始时位于 ( 1 , 1 ) (1, 1) (1,1) 的位置,问能否走到 ( n , m ) (n, m) (n,m) 位置。

输入格式

第一行,两个正整数 n , m n,m n,m。

接下来 n n n 行,输入这个迷宫。每行输入一个长为 m m m 的字符串,# 表示墙,. 表示空地。

输出格式

仅一行,一个字符串。如果机器猫能走到 ( n , m ) (n, m) (n,m),则输出 Yes;否则输出 No。

样例 #1

样例输入 #1

3 5
.##.#
.#...
...#.

样例输出 #1

Yes

提示

样例解释

路线如下: ( 1 , 1 ) → ( 2 , 1 ) → ( 3 , 1 ) → ( 3 , 2 ) → ( 3 , 3 ) → ( 2 , 3 ) → ( 2 , 4 ) → ( 2 , 5 ) → ( 3 , 5 ) (1,1)\to (2,1) \to (3,1) \to (3,2)\to (3,3) \to (2, 3) \to (2, 4) \to (2, 5) \to (3, 5) (1,1)→(2,1)→(3,1)→(3,2)→(3,3)→(2,3)→(2,4)→(2,5)→(3,5)

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 1 ≤ n , m ≤ 100 1 \leq n, m \leq 100 1≤n,m≤100,且 ( 1 , 1 ) (1,1) (1,1) 和 ( n , m ) (n, m) (n,m) 均为空地。


在这里插入图片描述


题解

错误示范

我们第一时间可以想到,这是一道简单的二维DFS题目,随便一些就能AC,这大概是你想到的代码:

#include <bits/stdc++.h>
using namespace std;
char a[105][105];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
int n,m;
bool vis[105][105];
void dfs(int x,int y)
{
	if(x<1 || x>n || y<1 || y>m || a[x][y]=='#')
	{
		return; 
	}
	if(x==n && y==m)
	{
		cout<<"Yes";
		exit(0);
	}
	
	for(int i=0; i<=3; i++)
	{
		int tx=x+dx[i];
		int ty=y+dy[i];
		if(!vis[tx][ty])
		{
			vis[tx][ty]=1;
			dfs(tx,ty);
			vis[tx][ty]=0;
		}
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1; i<=n ;i++)
	{
		string s;
		cin>>s;
		for(int j=0; j<m; j++)
		{
			a[i][j+1]=s[j];
		}
	}
	dfs(1,1);
	cout<<"No";
	return 0;
}

但是这样你只能得到10分
在这里插入图片描述

此时,我们可以想一想,你为什么需要回溯呢?
删除vis[tx][ty]=0;即可AC

正确代码

为了方便阅读,我直接给出了正确代码(我做人太好了

#include <bits/stdc++.h>
using namespace std;
char a[105][105];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
int n,m;
bool vis[105][105];
void dfs(int x,int y)
{
	if(x<1 || x>n || y<1 || y>m || a[x][y]=='#')
	{
		return; 
	}
	if(x==n && y==m)
	{
		cout<<"Yes";
		exit(0);
	}
	
	for(int i=0; i<=3; i++)
	{
		int tx=x+dx[i];
		int ty=y+dy[i];
		if(!vis[tx][ty])
		{
			vis[tx][ty]=1;
			dfs(tx,ty);
		}
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1; i<=n ;i++)
	{
		string s;
		cin>>s;
		for(int j=0; j<m; j++)
		{
			a[i][j+1]=s[j];
		}
	}
	dfs(1,1);
	cout<<"No";
	return 0;
}

怎么样,这是不是很简单呢?

总结

做题要思考!!!

洛谷【B3625】迷宫寻路题解 这道题用到的知识点是深度优先搜索,我们要一条路一条路地去试,直到找到那条正确的路,由于迷宫只有一条路,所以除去成功的剩下的都是失败条件。矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。先把全局变量定义好,由于这道题输入是字符,所以存储数组和标记数组都用char类型。定义一个自定义函数用于递归,因为涉及到位置,所以有两个参数。否则就标记走过并分别从上下左右四个方位搜索是否有路。仅一行,一个字符串。)根据题目只要到(n,m)的位置就结束。机器猫被困在一个矩形迷宫里。 阅读详情

相关推荐

洛谷 B3625 迷宫寻路 题解

我的第一篇题解,也是我自己梳理一下思路,写得不好,请多多指教。

weixin_59410814的博客 962

洛谷:B3625 迷宫寻路

机器猫被困在一个矩形迷宫里。迷宫可以视为一个n×m矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。机器猫初始时位于11的位置,问能否走到nm位置。

m0_73680520的博客 1533

洛谷B3625 迷宫寻路题目解析

迷宫可以视为一个 𝑛×𝑚 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。但这道题在深搜的板子上还要加一个终点判定,也就是在判断终点的时候加一个falg。机器猫初始时位于 (1,1) 的位置,问能否走到 (𝑛,𝑚) 位置。接下来 𝑛n 行,输入这个迷宫。每行输入一个长为 𝑚的字符串,仅一行,一个字符串。如果机器猫能走到 (𝑛,𝑚),则输出。思路我在上一篇博客讲过了,有想看可以点以下链接。机器猫被困在一个矩形迷宫里。第一行,两个正整数 𝑛,𝑚。

Luogu_Acgo_RuoJi的博客 854

B3625 迷宫寻路【DFS/BFS入门】详细版

学习笔记

elseif123的博客 702

详解电路设计中的RC电路

​ 一、什么是RC电路 RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用到 的电路。 常见的RC充、放电电路、RC积分电路合RC微分电路接下来详细讲解。 二、RC充、放电电路 RC充、放电电路如下图所示,下面通过充电和放电两个过程来分析此电路。 ​RC充、放电电路图 (1)RC充电电路 RC充电电路图如下图(a)所示 RC充电电路图及充电曲线图 ​由上图分析: 将上图a中开关S置于“1”处,电源E开始通过电阻R对电容C充电,由于刚开始充电时电容两端没有..

IT xiaobai 4万+

基于STM32与MPU6050的实时姿态检测系统设计与实现(源码+硬件解析)

本文详细介绍了基于STM32单片机与MPU6050传感器的实时姿态检测系统设计与实现。通过硬件解析、传感器校准、卡尔曼滤波算法和欧拉角计算,实现高精度姿态检测。提供完整源码和调试技巧,适用于无人机、平衡车等嵌入式开发项目,解决噪声干扰和数据漂移等常见问题。

jupi8的博客 497

洛谷B3625 迷宫寻路

机器猫被困在一个矩形迷宫里。迷宫可以视为一个n×m矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。机器猫初始时位于11的位置,问能否走到nm位置。

欢迎来到skw的博客 842

Lattice FPGA 开发工具Diamond使用流程总结——工具使用

本文介绍了一般的Diamond开发流程,包括工程创建、文件输入、IP使用、约束、管脚分配、和布线布局等流程

weixin_41895751的博客 2万+

C++DFS算法(洛谷B3625 迷宫寻路)

x2,y2表示当前点的坐标,上一个点判断有没有走出去,如果下一个点没有障碍(a[x2][y2] == 0)即到达下一个点。在主函数中预处理时将如果遇见障碍将a[i][j] = 1表示a[i][j]是障碍不能通行;n,m表示终点坐标,dx,dy表示一个点的下一步的四种走法对x,y的变化。DFS的遍历为A->B->D->E->C->F->G,加上特判如果起点或终点是障碍那么不能到达终点。如果当前点的已经到达终点就可以退出了。DFS全称深度优先搜索,如下图。

iclouding的博客 1168

DSP(数字信号处理器)技术概要

数字信号处理器(digital signal processor,DSP)是一种用于数字信号处理的可编程微处理器,它的诞生与快速发展,使各种数字信号处理算送得以实时实现,为数字信号处理的研究和应用打开了新局面,提供了低成本的实际工作环境和应用平台,推动了新的理论和应用领域的发展。目前,DSP技术在通信、航空、航天。雷达、工业控制、医疗、网络及家用电器等各个领域都得到了广泛应用。 1.1 DSP系统和芯片的结构特点1.1.1 DSP系统的基本结构通过传感数将非电物理量转换为模拟电信号,预处理一般包括放大器和滤

m0_46582485的博客 2万+

OpencvSharp学习笔记(一):图片的打开,保存灰度化,保存

近来萌生了学习OpenCv的想法,经过度娘得知老夫会的C#不能直接用OpenCv,只能用他的儿子OpenCvSharp与EmguCV,奈何奈何,这两玩意的资料少的出奇,只能慢慢的摸索了,EmguCV先不说,老夫找到了牛批的资料,先摸索OpencvSharp吧 首先打开VS通过Nuget安装 选择版本后点击安装就OK了. 安装完成后,引用里面就有以下的玩意儿了… 废话不多说了,在写程序前先 using OpenCvSharp 图片打开,灰度化,保存代码如下: static void Main(strin

猥琐de专注 7188

洛谷B3625迷宫寻路(dfs)

路线如下:(1,1)→(2,1)→(3,1)→(3,2)→(3,3)→(2,3)→(2,4)→(2,5)→(3,5)接下来随便讲一讲思路吧还是,首先呢,正常矩阵存图,没什么问题,vis打标记,表示过了那个点,然后就是inmap。dx,dy就是方向向量,无脑打,然后搜图,然后找到了就让pd=0;对于 100% 的数据,保证 1≤n,m≤100,且 (1,1) 和 (n,m) 均为空地。机器猫初始时位于 (1,1) 的位置,问能否走到 (n,m) 位置。如果机器猫能走到 (n,m),则输出。

m0_71761904的博客 898

混合示教长短时记忆网络的车辆轨迹预测研究

论文"混合示教长短时记忆网络的车辆轨迹预测研究"中数据处理及MTF-LSTM模型实现代码,模型在Pytorch框架下实现。

ColinFhz的博客 1448

洛谷 B3625 迷宫寻路 dfs

【代码】洛谷 B3625 迷宫寻路 dfs。

2303_79132118的博客 676

第201期 解锁科研效率新高度:Claude 科学技能插件(claude-scientific-skills)深度体验

科研AI助手Claude Scientific Skills开源工具为Claude大模型扩展科学能力,覆盖数据可视化、数学计算、学术格式处理等科研全流程需求。该插件支持LaTeX公式生成、自动化科研图表绘制、学术文档规范校正等功能,让研究人员通过自然语言指令即可完成专业任务。项目开源可定制,支持特定学科需求扩展,目前已托管于GitHub。使用门槛低,只需配置Claude API密钥即可快速启用,帮助科研人员从繁琐技术细节中解放,聚焦核心研究创新。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 1361

Open3D (C++) 使用点云创建数字高程模型DEM

Open3D (C++) 使用点云创建数字高程模型DEM

点云侠的博客 1392

[走迷宫上瘾]关于迷宫问题与深搜的爱恨情仇

题解

Michael-Shao的博客 1387

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【无标题】

搜索是C++中一种常用的算法,在很多题里面都是通用的(当然,有可能是的时候用)

2401_89046431的博客 1534

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NEUQ-ACM周报

【代码】NEUQ-ACM周报。

holazoe的博客 476

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【普及组】广度优先搜索BFS——到达型搜索问题_C++算法竞赛

广搜到达类问题的超详细总结,有例题,保准一看就懂。适合初学者及中等水平阅读,快来看ヾ(•ω•`)o

YLCHUP的博客 1336

关于DFS的两道经典题目

笔者在做完这道题目后,发现题目中涉及到了迷宫的路径,但是并没有要求把路径打印出来,所以我就把带有路径的代码写了一遍,小伙伴们有需要的可以去重温一下。虽然这次对于DFS算法并没有为大家总结很多题目,因为我觉得对于这一种算法,如果你能够把这两道题目真正的搞懂,那么遇到这类型的题目也只不过是套壳而已。最近也是在学习算法,重温DFS,感觉深有体会,之前写代码时一直不太会的同学大家可以选择性的去参考。首先是一道数学模拟的题目,但是感觉用DFS解决更加的清晰。最后,希望大家都可以坚持编程,每次都有不一样的收获。

m0_74417905的博客 261

ACM算法学习-第七周

【代码】ACM算法学习-第七周。

2303_77205282的博客 454

搜索必看!

字面意思,深度优先搜索,深度深度,就是向下挖掘,不断前进,向着一个方向前进,那什么叫回溯?在我们深度优先搜索时,我们路遇墙角或障碍,无法前进时,我们要回到起点,搜索下一条路径,所以代码里的vis数组,如果一条路被遍历过且无法走通,上面的点就变成1(注意初始化为0)。- 广度优先搜索 字面意思,广度地搜索,大范围地搜索,顾名思义,就是遍历一个点,同时遍历他周围的所有点,如果有点可以走通,再去往下遍历,直到终点。if(a[x][y]==1||a[x][y]==2)//如果已经被遍历过。a[x][y]=1;

pby130110的博客 508

图论DFS:黑红树

这永远不是最后一篇讲解算法的文章

Python_enjoy 是一个大帅哥! 3015
上一篇: DFS 算法:全排列问题
下一篇: 洛谷题解 - P1162 填涂颜色
Python_enjoy
博客等级 码龄4年 1201粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值