DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\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,这大概是你想到的代码:

cpp 复制代码
#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

正确代码

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

cpp 复制代码
#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;
}

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

总结

做题要思考!!!

相关推荐
Ocean☾2 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序10 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
Tianyanxiao31 分钟前
如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选
大数据·人工智能·科技·数据分析·深度优先·零售
爱吃生蚝的于勒32 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~35 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城1 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz1 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120082 小时前
初三数学,最优解问题
算法