Hdu 1429 胜利大逃亡(续)

hdu1429 胜利大逃亡(续) (广搜+状态压缩) 题目: 胜利大逃亡(续) 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 yy: 本来做了道自己认为不太简单的题很高兴。。但是一看。。夏天的风直接把他归类到搜索level1里面了。。。哎。。这就是差距啊。。。 思路: 广度优先搜索 + 状态压缩 由于只有10把钥匙,所以可以直接用状态压缩来做。。。其他就不说了,其实仔细一看, 阅读详情

胜利大逃亡(续)

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 22   Accepted Submission(s) : 10
Font: Times New Roman | Verdana | Georgia
Font Size: ← →

Problem Description

Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……

这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。

Input

每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:

. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J

每组测试数据之间有一个空行。

Output

针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。

Sample Input

4 5 17
@A.B.
a*.*.
*..*^
c..b*

4 5 16
@A.B.
a*.*.
*..*^
c..b*

Sample Output

16
-1


做完这题,我感觉自己不得不写一篇解题报告来解释了;

这题最大的精华就是它用了三维数组;

分析题目,就是当你拿到钥匙后,你该如果去寻找门,

因为,当你走到拿钥匙的地方的时候,可以门已经被你标记为走完了,

所以,大神们用了三维数组来解决,

当你拿到钥匙后,就进入另一个从未被标记过的二维空间,

再次进行广搜,就是,当你拿到钥匙,你就进入一个空间,当你打开一扇门,你就掉出一个空间,

这就是这道题目的精华所在,I think


#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
	int x, y, t, key;
};
int n, m, t;
int sx, sy;
char g[25][25];
bool vis[25][25][1<<10];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
bool flag;

void myscanf()
{
	for(int i=0;i<n;i++)
	{
		scanf("%s",g[i]);
		for(int j=0;j<m;j++)
		{
			if(g[i][j]=='@')
			{
				sx = i;
				sy = j;
				g[i][j]='.';
			}
		}
	}

}


void bfs()
{
	queue<node>q;
	node cur, v;
	cur.x = sx;
	cur.y = sy;
	cur.t = 0;
	cur.key = 0;
	vis[cur.x][cur.y][cur.key] = true;
	q.push(cur);
	
	while(!q.empty())
	{
		v = q.front();
		q.pop();
		if(v.t<t && g[v.x][v.y]=='^')
		{
			printf("%d\n",v.t);
			flag = true;
			return;
		}
		for(int i=0;i<4;i++)
		{
			cur.x = v.x + dx[i];
			cur.y = v.y + dy[i];
			cur.t = v.t + 1;
 			cur.key = v.key;
            if(g[cur.x][cur.y]>='a'&&g[cur.x][cur.y]<='z')
            cur.key=v.key|(1<<(g[cur.x][cur.y]-'a'));
 			if(g[cur.x][cur.y]=='*'||cur.t>=t)	continue;
 			else if(cur.x<0||cur.x>=n||cur.y<0||cur.y>=m||vis[cur.x][cur.y][cur.key])	continue;
 			else 
 			{
 				vis[cur.x][cur.y][cur.key] = true;
 				if(g[cur.x][cur.y]>='A' && g[cur.x][cur.y]<='Z')
 				{
 					if(cur.key&(1<<(g[cur.x][cur.y]-'A')))
 					{
 						q.push(cur);
 					}
 				}
 				else q.push(cur);
 			}
		}
	}
}

int main()
{
	while(scanf("%d%d%d",&n,&m,&t)!=EOF)
	{
		flag = false;
		memset(vis,false,sizeof(vis));
		memset(g,0,sizeof(g));
		myscanf();
		bfs();		
		if(!flag)	printf("-1\n");
	}

	return 0;
}



sentaurus学习笔记(HFET_pGate_GaN仿真)(五) `(sdedr:define-constant-profile`和`(sdedr:define-constant-profile-region`命令用于定义并应用一个恒定的活性硼掺杂浓度剖面`"ndop_GaN_gate_const"`到氮化镓栅极层上,其值为`NpGaN_gate`。- `"Oxide"`指定了这一层的材料名称(在这里代表氧化层),而`"nucleation"`是这一层在仿真中的标识名称。- `"GaN"`指定了这一层的材料名称,而`"GaN_gate"`是这一层在仿真中的标识名称。 阅读详情

相关推荐

CXL技术入门:从PCIe到高性能计算的桥梁(附最新2.0协议解析)

本文深入解析CXL技术如何作为PCIe的进化版,成为高性能计算的关键桥梁,特别聚焦CXL 2.0协议的关键升级。从技术架构、三大子协议到典型应用场景,全面介绍CXL在缓存一致性、内存共享等方面的优势,帮助开发者快速掌握这一前沿技术。

wdx012345的博客 728

HDOJ1429(胜利大逃亡(续))

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 611Accepted Submission(s): 213 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这...

weixin_30711917的博客 2340

MIC卡的OFED驱动安装

 IB网络和OFED驱动安装 IB InfiniBand是一个统一的互联结构,可以处理存储I/O、网络I/O和进程间通信(IPC)。它可以将磁盘阵列、SANs、LANs、服务器和集群服务器进行互联,也可以连接外部网络(比如WAN、VPN、互联网)。设计InfiniBand的目的主要是用于企业数据中心,大型的或小型的。目标主要是实现高的可靠性、可用性、可扩展性和高的性能。Inf

beglorious的专栏 5106

Hdu 1429 胜利大逃亡(续) 分类: Brush Mode ...

胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other)Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 22Accepted Submission(s) : 10 Font: Times New Roman | Verdana | Georgia ...

weixin_34160277的博客 115

SAP采购订单行项目增强实战:用BADI ME_GUI_PO_CUST添加自定义字段(避坑指南)

本文详细解析了如何通过BADI ME_GUI_PO_CUST在SAP采购订单行项目中添加自定义字段,包括技术架构理解、字段扩展步骤、自定义函数组创建及BADI实现。文章特别强调了避开官方文档未提及的陷阱,如字段映射限制和屏幕显示问题,并提供了高级优化技巧和性能建议。

weixin_30402343的博客 594

全志DRM框架下LVDS双屏异显配置实战

本文详细介绍了在全志DRM框架下配置LVDS双屏异显的实战经验。涵盖硬件连接、内核配置、设备树修改、背光控制及U-Boot适配等关键步骤,重点解析屏参转换技巧与双屏route配置,帮助开发者解决工业控制台等多屏应用中的显示适配问题,提升开发效率。

rnn9storyteller的博客 813

hdu1429胜利大逃亡(bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9204Accepted Submission(s): 3327 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨...

weixin_30933531的博客 126

生信物种注释软件Kraken2+Bracken的安装与使用

一、软件安装与数据库下载 1.Kraken2安装 Kraken2是一个基于k-mer算法的高精度宏基因组序列分类软件,能够快速的将测序reads进行物种分类。 使用conda一键安装,要先安装好anaconda或者miniconda conda install -y kraken2 输入krakek2 --help 出现如下所示帮助文档,则表示安装成功。 2.Bracken安装 bracken是一种从宏基因组数据中高度准确的计算物种丰度的统计方法。 同样使用conda一键安装 conda install -

jileiqwd的博客 1万+

HDU-1429 胜利大逃亡(续)

HDU 1429 胜利大逃亡(续) Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次...

你呢的博客 1314

【DaVinci Developer专题】-28-Client Server Port Interface中useArgumentType、useArrayBaseType和useVoid介绍

共7页 目录 1 ImplPolicy = useArgumentType 2 ImplPolicy = useArrayBaseType 3 ImplPolicy = useVoid 4 三者代码差异部分 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer

「汽车电子助手」的博客 1502

MATLAB与ROS联合仿真——实例程序搭建思路

MATLAB与ROS联合仿真——实例程序搭建思路

慕羽★的博客 5229

HDU - 1429 - 胜利大逃亡(续)

胜利大逃亡(续)题目传送:HDU - 1429 - 胜利大逃亡(续)基础广搜题,注意是用位运算来判断的是否有钥匙的。少写一个字母找了好久的bug。。好久的bug。。的bug。。bug。。gAC代码:#include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #inc

Never say never 1163

华为昇腾(Ascend)开发考试原题目解析 (2024) (题库一)——HCIP-AI-Ascend Developer——第一部分

给出一段代码如下,以下哪个选项描述错误?...A.中的语句由 MindSpore 接管,有语法限制B. 算子在中定义,并用来建立网络C.__init__()中的语句由 Python 解析执行D. 网络定义必须继承基类nn.Cell正确答案: B__init__()用于定义算子和网络层。所有需要用到的层(如卷积层、全连接层等)都应该在这里进行实例化。这部分代码由Python解释器执行。用于构建前向计算图。它调用在__init__()中定义好的算子和层来描述数据的流向。

qq_38334677的博客 1053

hdu1429胜利大逃亡(续)(状态压缩+bfs)

题目链接: 啊哈哈,点我点我 题意及思路 两个状态压缩+bfs的题,两个题其实是一样的,所以我讲一个。。。就选1429吧。。 最开始我以为跟普通的bfs一样,所以直接写了一个朴素的bfs,一跑,前两组数据对了,但是第三组不对,一看,走过的还可以走啊,所以不能标记,结果我的bfs乱改,最后 毫无疑问改成了死循环。所以看题解。。。 思路:因为有10中不同的钥匙,每种都有两种状态,所以结合

大洋深处 2199

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

hdu 1429 胜利大逃亡(续)

hdu 1429 胜利大逃亡(续)         这是一道广搜题. 刚开始看有点思路, 但是实现起来需要定义一些相关的结构体,比较麻烦.尤其是怎么处理拿到钥匙和开门......         下面这种方法能为下次做类似的题提供更多的想法.         后来看到了某大神的一种更好的办法来处理钥匙和开门的问题, 那就是位运算来模拟拿钥匙和开门. 看了一篇思路就很清晰了.

happen_zhang 1597

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HDU 1429.胜利大逃亡(续)

胜利大逃亡(续) Time Limit:2000MSMemory Limit:32768KB64bit IO Format:%I64d & %I64u SubmitStatusPracticeHDU 1429 Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignati...

weixin_30558305的博客 133

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

胜利大逃亡(续) HDU - 1429

胜利大逃亡(续) HDU - 1429

weixin_29216119的博客 292

HDU1429 胜利大逃亡(续)

http://acm.hdu.edu.cn/showproblem.php?pid=1429学习位压缩很好的一道题,因为只有10把钥匙,那么可以把10钥匙压缩二进制,比如1000就表示身上只要第4把钥匙的状态,110表示带有第2把和第3把钥匙,那么要判断当前的钥匙串有没有能打开当前门钥匙,那么就只要一个&运算就可以,因为11101110&00100000==00100000 这样就说明那一把钥

3081

胜利大逃亡(续) HDU-1429

胜利大逃亡(续) HDU-1429 题目链接 思路:状态压缩+bfs 状态压缩很常用也很简单,网上有很多关于状态压缩的博客,我就不再赘述。因为A-J只有十把钥匙和门,而状态只有找到和没有找到钥匙,利用二进制进行状态压缩。 坑:时间到了则判为失败,而不是被抓回起点。#include <bits/stdc++.h> #define maxn 22 using namespace std; in

acmer_guo的博客 317

HDU 1429-胜利大逃亡(续)

A - 胜利大逃亡(续) Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1429 Appoint description:  System Crawler  (2015-11-09) Description

梧桐下的四叶草 459

hdu 1429胜利大逃亡(续)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1429 一开始想了好几种方法。。最后实验都错了。。 要么是就是算法思想错误。。 然后以为可以这样。。果断。。内存超出。 下面是错误代码。。。 #include #include #include using namespace std; #define N 21 int n,m,t; ch

1446

Syins写的bfs例题——胜利大逃亡(续)HDU1429

胜利大逃亡(续) Time limit2000 ms Memory limit32768 kB Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟...

weixin_45676801的博客 324

C - 胜利大逃亡(续) HDU - 1429

C - 胜利大逃亡(续) HDU - 1429 #include<cstdio> #include<cstring> #include<queue>using namespace std;int n,m,t; char mp[100][100]; struct data { int x,y; int cost; int sta;}st,en; int dx[]={-1,0,1

neuike的博客 380

hdu1429 胜利大逃亡(续)

题目链接 跟简单搜索不同的是,这个钥匙开门机制,确实很难去想。后来看到了别人将其转化为二进制数进行存储表示钥匙状态,因为最多10把钥匙,所以只需要2^10就可以存下,而且要注意,因为在取钥匙开门的过程中,可能会走过一个点数次,所以需要将钥匙状态存储并判断是同一状态下,有无重复走过。 if(maps[next.x][next.y] >= 'a' &&maps[next.x][next.y] <= 'j'){ int temp1 = maps[next.x][ne

CUCUC1的博客 205
上一篇: Hdu 1010 Tempter of the Bone
下一篇: JAVA 显示图片的简单源码
梁千仞
博客等级 码龄15年 12粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值