栈实现深度优先搜索

news2024/10/6 16:26:15

引言

之前刚学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.coloradmin.cn/o/1089852.html

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

相关文章

leetcode oj

150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;定义一个名为 Solution 的类&#xff0c;并在其中定义了一个名为 evalRPN 的公共函数。这个函数接受一个由字符串组成的向量 tokens 作为输入&#xff0c;并返回一个整数。 在代码中&#xff0…

从基础到卷积神经网络(第12天)

1. PyTorch 神经网络基础 1.1 模型构造 1. 块和层 首先&#xff0c;回顾一下多层感知机 import torch from torch import nn from torch.nn import functional as Fnet nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))X torch.rand(2, 20) # 生成随机…

IPv6环境telnet报错:Permission denied

一、问题描述 某次redis迁移时&#xff0c;对新的redis集群进行新组建时&#xff0c;一直卡在Waiting for the cluster to join …&#xff0c;如下所示&#xff1a; 对端主机telnet本段端口&#xff0c;telnet报错&#xff1a;Permission denied&#xff0c;如下所示&#xff…

【软件设计师-下午题总结】

目录 下午题之总结于学习记录&#xff1a;题一、数据流图&#xff1a;1、熟悉相关的图形2、实体名称3、数据存储4、补充缺失的数据流和起点终点5、用结构化语言描述6、描述&#xff0c;找加工逻辑的时候7、如何保持数据流平衡 题二&#xff1a;实体联系图&#xff1a;1、常用图…

为Mkdocs网站添加评论系统(以giscus为例)

官方文档&#xff1a;Adding a comment system 这里我同样推荐giscus 利用 GitHub Discussions 实现的评论系统&#xff0c;让访客借助 GitHub 在你的网站上留下评论和反应吧&#xff01;本项目深受 utterances 的启发。 开源。&#x1f30f;无跟踪&#xff0c;无广告&#…

有关范数的学习笔记

向量的【范数】&#xff1a;模长的推广&#xff0c;柯西不等式_哔哩哔哩_bilibili 模长 范数 这里UP主给了说明 点赞 范数理解&#xff08;0范数&#xff0c;1范数&#xff0c;2范数&#xff09;_一阶范数-CSDN博客 出租车/曼哈顿范数 det()行列式 正定矩阵&#xff08;Posit…

【网安必读】CTF/AWD实战速胜指南《AWD特训营》

文章目录 前言&#x1f4ac;正文这本书好在哪❔这本书讲了什么❔文末送书 前言&#x1f4ac; 【文末送书】今天推荐一本网安领域优质书籍《AWD特训营》&#xff0c;本文将从其内容与优势出发&#xff0c;详细阐发其对于网安从业人员的重要性与益处。 正文 &#x1f52d;本书…

【奇葩问题】微信小程序 We分析 访问来源Top10的总比例为什么不止100%

今天有朋友在小程序后台开访问来源数据的时候发现三个渠道来源的比例超过了100% 搜了很多文章最终在官方社区找到了官方回复&#xff1a; 超过100%&#xff0c;是因为可能有用户&#xff0c;在当日通过多个场景&#xff0c;打开过你的小程序 比如用户A&#xff0c;上午通过【…

【Linux】进程概念讲解

前言 在了解进程概念之前&#xff0c;还有很多东西需要我们先了解&#xff0c;以助我们更好地学习以后的知识 大部分都是概念的东西&#xff0c;大部分大概有个印象就好了 冯诺依曼体系结构&#xff08;硬件方面&#xff09; 当代计算机的设计都是按照冯诺依曼体系结构设计…

Leetcode101.对称二叉树

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Leetcode &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…

代码随想录算法训练营第五十二天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 视频讲解&#xff1a;动态规划&#xff0c;股票至多买卖两次&#xff0c;怎么求&#xff1f; | LeetCode&#xff1a;123.买卖股票最佳时机III_哔哩哔哩_bilibili 代码随想录 &#xff08;1&#xff09;代码 188.买卖股票的最佳时机IV 视频讲解&a…

堆叠注入([强网杯 2019]随便注1)

详解&#xff1a; 堆叠注入&#xff08;Stack Injection&#xff09;是一种计算机安全概念&#xff0c;涉及攻击者向程序的堆栈内存中插入恶意代码&#xff0c;以便在程序执行期间执行非预期的操作。 堆栈注入攻击通常利用程序在处理函数调用时使用的堆栈机制。当一个函数被调…

力扣刷题 day43:10-13

1.完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 …

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

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

IWDG与WWDG (学习)

IWDG Independent watchdog&#xff0c;即独立看门狗 IWDG&#xff1a;能产生系统复位信号的计数器 递减的计数器时钟由独立的RC振荡器提供&#xff08;可在待机和停止模式运行&#xff09;看门狗被激活后&#xff0c;当递减计数器计数到0x000时产生复位 喂狗&#xff1a;在…

【C++】继承 ② ( 继承语法 | 三种继承 - 共有继承 / 保护继承 / 私有继承 | 继承与父类私有成员 | 子类访问父类私有成员 | 代码示例 )

文章目录 一、继承语法1、语法说明2、三种继承 - 共有继承 / 保护继承 / 私有继承3、继承与父类私有成员4、子类访问父类私有成员 二、代码示例 - 继承语法 一、继承语法 1、语法说明 继承语法 : 使用 class 关键字 定义 子类 , 在 子类后面 使用 冒号 : 与 若干父类隔开 ; cl…

Viewport的作用

什么是 Viewport? viewport 是用户网页的可视区域。 viewport 翻译为中文可以叫做"视区"。 手机浏览器是把页面放在一个虚拟的"窗口"&#xff08;viewport&#xff09;中&#xff0c;通常这个虚拟的"窗口"&#xff08;viewport&#xff09;比…

如何实现前端路由保护?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C语言编写简易图书管理系统

这篇文章介绍了一个基本的图书管理系统的实现&#xff0c;它允许用户添加、插入、删除、修改、显示和查询图书的功能。该系统通过使用二进制文件将图书信息保存到磁盘&#xff0c;并且在程序启动时能够加载已保存的图书信息。 介绍 在计算机科学中&#xff0c;图书管理系统是…

buffer overflow detected

背景 在应用上云改造中&#xff0c;业务场景如下&#xff1a; 在使用ecs的场景中&#xff0c;应用的ip都是固定的&#xff1b;在使用k8s之后pod的ip就变的不固定了&#xff0c;k8s提供了statefulset的模式来支持这种场景&#xff0c;以固定域名的方式支持。 问题 在平台pod开…