【洛谷P2199】最后的迷宫【BFS】【DFS】

洛谷P2199 【最后的迷宫】题解 题目自己看,链接:最后的迷宫-洛谷 (脑袋有问题的人也知道这是道BFS题) N×M≤16384,这道题本身内存有点小,极限数据是1≤N,M≤16384,因为N和M有可能是1。一开始我MLE了,但最终还是卡数据卡过去了。 话不多说,代码整上。 首先是最基本的头文件、变量、位移数组。 #include<bits/stdc++.h> using namespace std; const int dx[]={1,0,-1,0,1,-1,1,-1}; const int dy[]={0,1,0 阅读详情

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P2199
给出一个图及起点和终点,只要到达终点所在行、列或对角线上且两点之间没有墙就算到达终点。求到达终点的最少步数。


思路:

这道题真的算是蓝题吗。。。
算是很裸的广搜了。
这道题和裸的广搜其实只有一个差别:只要到达终点所在行、列或对角线上且两点之间没有墙就算到达终点。也就是说,这道题有多个终点,到达任意一个即可。
那么就直接跑一边DFS,从原终点往8个方向跑,直到遇见墙为止。那么走到的点就都是成立的终点。
之后就从起点跑BFS。就完全是裸的了。
还有这道题说 100 % 100\% 100%的数据范围是 n × m ≤ 16384 n\times m\leq 16384 n×m≤16384,所以如果是最坏情况就会有 n = 1 , m = 16384 n=1,m=16384 n=1,m=16384,那么开二维数组就会炸内存。所以要把二维数组压成一个一位数组。
有多组数据,所以时间复杂度为 O ( t n m ) O(tnm) O(tnm)


代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int dx[]={0,1,-1,0,0,-1,-1,1,1};
const int dy[]={0,0,0,1,-1,-1,1,-1,1};
int n,m,sx,sy,tx,ty,head,tail,ans[20501],state[20501];
bool a[20501],map[20501],p[20501];
char c;

void dfs(int x,int y,int k)  //找终点
{
	if (map[(x-1)*m+y]==1) return;  //墙
	if (x<1||x>n||y<1||y>m) return;  //越界
	a[(x-1)*m+y]=1;  //标记为终点
	dfs(x+dx[k],y+dy[k],k);
}

void bfs()  //裸的广搜
{
	head=0;
	tail=1;
	state[1]=(sx-1)*m+sy;
	while (head<tail)
	{
		head++;
		for (int i=1;i<=4;i++)
		{
			tail++;
			int x=(state[head]-1)/m+1;  
			int y=state[head]-(x-1)*m;  //取出行和列
			x+=dx[i];
			y+=dy[i];  //移动
			if (x<1||x>n||y<1||y>m)  //越界
			{
				tail--;
				continue;
			}
			state[tail]=(x-1)*m+y;  //入队
			if (p[state[tail]]||map[state[tail]])   //来到过这个点或是墙
			{
				tail--;
				continue;
			}
			p[state[tail]]=1;
			ans[tail]=ans[head]+1;
			if (a[state[tail]])  //到达任意一个终点
			{
				printf("%d\n",ans[tail]);
				return;
			}
		}
	}
	printf("Poor Harry\n");  //无法到达
}

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	 for (int j=1;j<=m;j++)
	 {
		cin>>c;
		while (c=='\n'||c==' ') cin>>c;
		if (c=='X') map[(i-1)*m+j]=1;
	 } 
	while (1)
	{
		scanf("%d%d%d%d",&tx,&ty,&sx,&sy);
		if (!tx&&!ty&&!sx&&!sy) break;
		memset(a,0,sizeof(a));
		memset(ans,0,sizeof(ans));
		memset(p,0,sizeof(p));
		a[(tx-1)*m+ty]=1;
		for (int i=1;i<=8;i++)
		 dfs(tx,ty,i);
		if (a[(sx-1)*n+sy])   //特判,本来就在终点上
		{
			printf("0\n");
			continue;
		}
		bfs();
	}
	return 0;
}
P2199 最后的迷宫 看题目是一个无权图最短路,用广搜很合适,但是有一个条件,哈利到了看到火焰杯的地方,就能直接拿到火焰杯,那么我们从火焰杯的位置向8个方向遍历,处理出来能直接看到火焰杯的地方,这样,原先广搜的终点,由一个火焰杯的位置,变成了我们上面处理之后的若干个点,不能拿到火焰杯的情况也同理很简单,就是无解,这个题是个裸的广度优先搜索,但是有点预处理,双向搜索的味道,我只知道有双向搜索这个东西,什么是双向搜索一点也不知道,13分钟直接过了,这个题的思想感觉还是很重要的,反向,预处理,等等。知识点:广度优先搜索。 阅读详情

相关推荐

P2199 最后的迷宫C++

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

gzt8071的博客 845

题解:洛谷 P2199 最后的迷宫

题目显然,数据最大,数组我们开不下,动态开数组。对于每一个查询,从起点开始,走一步判断是否能看到火焰杯。如果已经没法走了,直接拆墙,输出 Poor Harry。

ATION001的博客 499

【YbtOJ高效进阶 广搜-1】走迷宫

现在有一个 N*N 的地图,问从起点 (sx,sy) 到 (tx,ty) 最少要走几步。

blog 529

洛谷_P2199 最后的迷宫 (尚贤)

【题目】:https://www.luogu.com.cn/problem/P2199 暴力(详见代码) //存图时先将墙和边界都赋值为false,这样Bfs时可以少判边界 #include <cstdio> #include <string> #include <queue> #include <cstring> #include <iost...

广东省清远市博爱学校—尚贤的博客 518

车载以太网抓包实战:100BASE-T1/1000BASE-T1高效监控方案解析

本文深入解析了车载以太网100BASE-T1/1000BASE-T1的高效抓包监控方案。针对智能汽车开发中的故障排查与性能测试需求,详细对比了交换机镜像、TAP分流和捕获模块三大主流方案的原理、核心优势与适用场景,并提供了基于实战经验的选型指南与操作避坑要点,帮助工程师精准定位网络问题。

desk3的博客 426

用SOLIDWORKS从零画一个履带机器人,手把手教你搞定底盘和传动

本文详细介绍了如何使用SOLIDWORKS从零开始设计履带式机器人,重点讲解底盘结构优化和传动系统设计的关键步骤。通过七个阶段的实战指南,包括前期规划、底盘建模、驱动系统装配、履带生成、动态模拟等,帮助工程师和爱好者掌握履带机器人的核心设计技巧,提升地形适应能力和动力效率。

weixin_30872499的博客 632

【专题】深度优先搜索(DFS) 从入门到精通—— 结合洛谷习题

深度优先搜索(DFS) 结合洛谷习题 文章目录深度优先搜索(DFS) 结合洛谷习题前言一、深度优先搜索是什么?二、洛谷例题1.P1706全排列问题题目描述输入格式输出格式输入输出样例题解:代码解读:2.P1605 迷宫题目背景题目描述输入格式输出格式输入输出样例说明/提示题解 前言 当处于一个巨大的迷宫中,你只有第一人称视角,应该如何以最快速度走出这个迷宫呢? 依据深度优先算法,这种策略一定有效:以当前位置为起点,沿着一条路向前走。当遇到一个岔路口时,就选择一个岔路前进,如果这个岔路是死胡同,就退回上一个

MaxwellWong 1083

逆向实战:360加固DEX解密全流程解析(附Frida脚本与SoFixer修复技巧)

本文深入解析360加固DEX解密的全流程,涵盖动态Hook技术、Frida脚本应用及SoFixer修复技巧。通过实战案例详细展示如何识别加固特征、定位关键函数、实现ELF文件修复,并解析RC4和zlib解密算法,为逆向工程师提供全面的技术指导。

weixin_29323551的博客 608

1605 迷宫

难度:普及- 题目类型:深搜 提交次数:1 涉及知识:深搜 题目背景 迷宫 【问题描述】 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫 中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 输入样例 输出样例 【数据规模】 1≤N,M≤5 题目...

weixin_30376509的博客 579

SDFCOM_SWC警告深度剖析:从assign短路到时序标注失效的链路追踪

本文深入剖析了SDFCOM_SWC警告的根源,从assign短路到时序标注失效的全链路追踪。通过分析RTL设计中的assign语句陷阱、综合阶段的优化变形以及PrimeTime生成SDF文件的视角,提出了重构RTL设计、警告抑制和SDF生成优化等解决方案,帮助工程师有效避免时序标注问题。

weixin_42519985的博客 361

Labview调用C++ dll之字符串数组传递

做项目的时候碰到了一个需求,有一个复杂的运算,用labview实现非常的麻烦,但是如果用C++实现,就会灵活很多。尝试着采用Labview调用C++编写的动态链接库方式解决,兼顾Labview的便利和C++的灵活性。 运算好说,主要难点是Labview与C++之间的数据对应关系,因为我最后的结果是既有字符串又有数字,对于单纯的数字来说,直接通过调用数组的方式就能解决,这里主要记录一下字符串数组...

bgbgx的博客 6806

洛谷 2199 最后的迷宫

#include<iostream> #include<utility> #include<string.h> #include<vector> #include<queue> using namespace std; typedef struct{ int x; int y; int step; }P; queue<P&gt...

yu727399的博客 297

忘记安卓锁屏密码怎么办?3种方法教你用ADB恢复访问(含gesture.key解密)

本文详细解析了安卓设备锁屏密码的存储与加密机制,特别是gesture.key文件的解密原理。针对遗忘密码的常见问题,提供了三种核心恢复方法:利用ADB调试接口删除密码文件、对gesture.key进行离线分析与解密,以及应对高版本系统的替代方案。重点介绍了通过ADB工具在Recovery模式下操作的具体步骤,帮助用户在合法合规前提下恢复设备访问权限。

php55的博客 954

洛谷P1605 迷宫

迷宫 题目链接 这道题就是一道简单的dfs计方案数qwq。 我的思路是把表初始化为1,再将障碍改为0,因为在全局定义中数组会直接初始化为0,所以就少去了对边界的特判。 next数组加循环可以减少代码量。 注意一定要记得先把起始点标记!!! AC代码如下: #include<iostream> #include<cstdio> #include<cstring&gt...

weixin_33834910的博客 155

基于mengzi-t5训练生成式模型

【代码】基于mengzi-t5训练生成式模型。

开卷有益 169

前端使用二开Thingsboard一、二、三事(四)-部件库

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 739

洛谷P1605迷宫题解

洛谷P1605迷宫题解

weixin_62824549的博客 757

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

P1605 迷宫(洛谷详解)

我们在之前的章节介绍了暴力枚举策略,将所有可能的情况都枚举一遍以获得最优解,但是枚举全部元素的效率如同愚翁移山,无法应付数据范围稍大的情形。本章在暴力枚举的基础上介绍了搜索算法,包括深度优先搜索和广度优先搜索,从起点开始,逐渐扩大寻找范围,直到找到需要的答案为止。严格来说,搜索算法也算是一种暴力枚举策略,但是其算法特性决定了效率比直接的枚举所有答案要高,因为搜索可以跳过一些无效状态,降低问题规模。在算法竞赛中,如果选手无法找到一种高效求解的方法(比如贪心、递推、动。

Aa12345678bbb的博客 1431

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

dfs算法总结,通过dfs解决洛谷中部分例题

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。(简单来说就是一条路走到黑,直到走不动,再回头继续走,直到搜索完全部为止)过程图如下:深度优先搜索。

sin1810335764的博客 1572

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

迷宫问题【洛谷P1238】

迷宫求解存个题型

m0_66038685的博客 244

洛谷P1605:迷宫

给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。第二行为四个正整数 SX,SY,FX,FY。行,每行两个正整数,表示障碍点的坐标。输出从起点坐标到终点坐标的方案总数。,分别表示迷宫的长宽和障碍总数。第一行为三个正整数 N,M,T。代表起点坐标,FX,FY。

m0_73648729的博客 895

01迷宫(洛谷 P1141)

这是洛谷上一道BFS的题,但直接暴力会TL,因为数据范围太大了,需要一些小思维优化一下,我这里选择的是用连通块优化,这道题BFS连通块就能AC了。这道题也没什么可说的,还是那句话,在写题之前,一定要先看清数据范围,计算时间复杂度,选择方法……另外就是一定要掌握连通块这种方法,在优化处理BFS和DFSTL的时候会经常用到。

2402_86265887的博客 1485

dfs入门(洛谷等例题)

回溯法——1700:八皇后问题 回溯法(back track method) 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 思路: 题目大意:通过对一个除叶子节点外每个节点含有8个分支的树进行适当的目标筛选...

人工智能方向,计算机视觉(https://github.com/chenshunpeng) 696

洛谷P1238 走迷宫——dfs

有一个 m×n 格的迷宫(表示有 m 行、n 列),其中有可走的也有不可走的,如果用 1 表示可以走,0 表示不可以走,文件读入这 m×n 个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。如果一条路都不可行,则输出相应信息(用 −1 表示无路)。第一行是两个数 (1<m,n<15),接下来是 m 行 n 列由 1 和 0 组成的数据,最后两行是起始点和结束点。所有可行的路径,描述一个点时用 (x,y) 的形式,除开始点外,其他的都要用。优先顺序:左上右下。

m0_62902215的博客 300
上一篇: 【JZOJ 3470】最短路【最短路】【DFS】
下一篇: 斐波拉契数列IV【矩阵乘法】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值