栈实现深度优先搜索

news/2024/7/20 20:25:31 标签: 深度优先, 算法, 图论

引言

之前刚学DFS的时候并不完全理解为什么递归可以一直往下做,后来直到了递归的本质是栈,就想着能不能手写栈来代替递归呢。当时刚学,自己觉得水平不够就搁置了这个想法,今天上数据结构老师正好讲了栈的应用,其中就有一个走迷宫问题,于是写下这篇文章,希望能帮助大家更好的理解DFS。

B3625 迷宫寻路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

DFS

#include<bits/stdc++.h>
const int N=110;
char g[N][N];
bool st[N][N];
int n,m;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int flag=0;
void dfs(int x,int y)
{
    if(flag) return;
	if(x==n&&y==m)
	{
		flag=1;
		return ;
	}
	for(int i=0;i<4;i++)
	{
		int a=x+dx[i];
		int b=y+dy[i];
		if(a<1||b<1||a>n||b>m) continue;
		if(g[a][b]=='#') continue;
		if(st[a][b]) continue;
		
		st[a][b]=true;
		dfs(a,b);
		if(flag) return;
		st[a][b]=false;
	}
	return ;
}
signed main()
{
	std::cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			std::cin>>g[i][j];
		}
	}
	st[1][1]=true;
	dfs(1,1);
	if(!flag) std::cout<<"No"<<'\n';
	else std::cout<<"Yes"<<'\n';
	return 0;
}

因为这题数据是100,所以DFS是过不了哒。正解应该是BFS。 

 栈的写法可以直接ac,效率可见一斑。

#include<bits/stdc++.h>
const int N=110;
typedef std::pair<int,int> PII;
char g[N][N];
bool st[N][N];
int n,m;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int flag=0;

void dfs(int x,int y)
{
    std::stack<PII> stk;
    st[x][y]=true;
    stk.push({x,y});
    
    while(!stk.empty())
    {
    	auto t=stk.top();
    	int a=t.first;
    	int b=t.second;
    	if(a==n&&b==m)
    	{
    		flag=1;
    		return ;
		}
    	int ok=0;
    	for(int i=0;i<4;i++)
    	{
    		int na=a+dx[i],nb=b+dy[i];
    		if(g[na][nb]=='#') continue;
    		if(st[na][nb]) continue;
    		if(a<1||b<1||a>n||b>m) continue;
    		
    		//这个点可以走
    		ok=1;
			st[na][nb]=true; 
    		stk.push({na,nb});
		}
		if(!ok)
		{//不回溯是因为到这一步说明这个点是死胡同 
			//st[stk.top().first][stk.top().second]=0;
			stk.pop();
		}
	}
	return ;
}
signed main()
{
	std::cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			std::cin>>g[i][j];
		}
	}
	dfs(1,1);
	if(flag) std::cout<<"Yes"<<'\n';
	else std::cout<<"No"<<'\n';
	return 0;
}

BFS

宽度优先搜索

#include<bits/stdc++.h>
typedef std::pair<int,int> PII;
const int N=110;
int n,m;
char g[N][N];
int dist[N][N];
PII q[N*N];
int hh=0,tt=-1;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

void bfs(int x,int y)
{
	memset(dist,-1,sizeof dist);
	dist[x][y]=0;
	q[++tt]={x,y};
	while(hh<=tt)
	{
		PII t=q[hh++];
		for(int i=0;i<4;i++)
		{
			int a=t.first+dx[i];
			int b=t.second+dy[i];
			if(dist[a][b]!=-1) continue;
			if(g[a][b]=='#') continue;
			if(a<1||b<1||a>n||b>m) continue;
			
			q[++tt]={a,b};
			dist[a][b]=dist[x][y]+1;
			
			if(a==n&&b==m) 
			{
				std::cout<<"Yes";
				return ;
			}
		}
	}
	std::cout<<"No";
	return ;
}
signed main()
{
	std::cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			std::cin>>g[i][j];
		} 
	}
	bfs(1,1);
	
	return 0;
}


http://www.niftyadmin.cn/n/5087217.html

相关文章

【Arduino+ESP32+腾讯云+sg90】强制门户+腾讯云控制开关灯

作者有话说 博主对于Arduino开发并没有基础&#xff0c;但是为了实现更加方便的配网&#xff0c;这几天一直在尝试用ESP32-12F&#xff08;因为手头刚好有一个&#xff0c;其他的也可以&#xff09;来做远程开关灯&#xff01;不知道大家是否注意到&#xff0c;上一篇利用STM32…

论Oracle兼容性,我们需要做什么

作者介绍&#xff1a;王海峰&#xff0c;数据库系统架构师&#xff0c;YashanDB SQL开发负责人&#xff0c;10年以上数据库内核技术开发经验。 Oracle兼容性是目前国产数据库的关键任务之一&#xff0c;其直接影响到商业迁移的成本和竞争力。 我们经常发现&#xff0c;部分国产…

Vue实战项目1:跑马灯效果

Vue实战项目1&#xff1a;跑马灯效果 目录 一、效果预览二、编写思路三、整体代码展示 一、效果预览 二、编写思路 两个按钮用于启动和停止&#xff0c;绑定点击事件&#xff0c;使用v-on&#xff0c;可以简写为 <input type"button" value"跑起来" c…

【Java题】将char类型的值转化为int类型的值

字符变量charVar的值是“我”字。程序中输出了该字符的Unicode值以及Unicode值对应的十进制数值&#xff0c;并打印输出了charVar与一个int型变量做加法运算后的值 public class Test {public static void main(String[] args) {int intResult,intVar10;char charVar我;intRe…

20基于MATLAB的车牌识别算法,在环境较差的情景下,夜间识别度很差的车牌号码可以精确识别出具体结果,程序已调通,可直接替换自己的数据跑。

基于MATLAB的车牌识别算法&#xff0c;在环境较差的情景下&#xff0c;夜间识别度很差的车牌号码可以精确识别出具体结果&#xff0c;程序已调通&#xff0c;可直接替换自己的数据跑。 20matlab车牌识别 (xiaohongshu.com)

React知识点系列(5)-每天10个小知识

目录 1. 请解释一下什么是 React 的 Strict Mode&#xff0c;以及它对于开发和调试 React 应用有什么帮助&#xff1f;2. 在 React 中&#xff0c;如何使用 useCallback Hook 来优化性能&#xff1f;3. 你能解释一下什么是 React 的 Suspense 组件吗&#xff1f;如何在项目中使…

Nie et al. 2010 提出的不等式定理

这里写自定义目录标题 定理 定理 For any vector a a a and b b b, we have ∥ a ∥ 2 − ∥ a ∥ 2 2 ∥ b ∥ 2 ≤ ∥ b ∥ 2 − ∥ b ∥ 2 2 ∥ b ∥ 2 \|a\|_{2} - \frac{\|a\|_{2}}{2\|b\|_{2}} \leq \|b\|_{2} - \frac{\|b\|_{2}}{2\|b\|_{2}} ∥a∥2​−2∥b∥2​∥…

一文就懂大语言模型Llama2 7B+中文alpace模型本地部署

大语言模型Llama2 7B中文alpace模型本地部署 VX关注晓理紫并回复llama获取推理模型 [晓理紫] 1、Llama模型 一个由facebook发布的生成式语言模型&#xff0c;具体可以到其官方了解。 为了大家更好理解&#xff0c;这里把目录结构显示下一如下图。 2、 下载Llama并配置环境 …