A计划 HDU杭电2102【广搜+STL队列】

Problem Description

可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。

现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。

Input

输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

Output

如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

Sample Input

1
5 5 14
S*#*.
.#...
.....
****.
...#.

..*.P
#.*..
***..
...*.
*.#..

Sample Output

YES

//‘*‘表示石头

// ‘#‘表示经过了就必须要穿越到另外的

//‘.‘可以走的路,但要花时间

#include <cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct help
{
	int x,y,z;
	int time;
};
char map[15][15][15];
bool vis[15][15][15];
int ex,ey,ez;
int sx,sy,sz;
int dx[]={0,0,-1,1,0,0};
int dy[]={1,-1,0,0,0,0};
int dz[]={0,0,0,0,-1,1};
int n,m,limit;
bool judge(int x,int y,int z)
{
	if(vis[z][x][y] || x>n || x<1 || y>m || y<1 || map[z][x][y]=='*')
		return 0;
	return 1;
}
int BFS()
{
	memset(vis,0,sizeof(vis));
	queue<help>q;
	help pos,next;
	pos.x=sx;
	pos.y=sy;
	pos.z=sz;
	pos.time=0;
	vis[0][1][1]==1;
	q.push(pos);
	while(!q.empty())
	{
		pos=q.front();
		q.pop();
		for(int i=0;i<4;++i)
		{
			next.x=pos.x+dx[i];
			next.y=pos.y+dy[i];
			next.z=pos.z;
			next.time=pos.time+1;
			if(!vis[next.z][next.x][next.y]&&map[next.z][next.x][next.y]=='#')
			{
				if(map[!next.z][next.x][next.y]=='#'||map[next.z][next.x][next.y]=='*')
				{
					vis[next.z][next.x][next.y]=1;
					continue;
				}
				next.z=!next.z;
			}
			if(judge(next.x,next.y,next.z))
			{
				if(next.x==ex&&next.y==ey&&next.z==ez)
				{
					return next.time;
				}
				vis[next.z][next.x][next.y]=1;
				q.push(next);
			}
		}
	}
	return -1;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&m,&limit);
		getchar();
		for(int i=0;i<=1;++i)
		{
			for(int j=1;j<=n;++j)
			{
				for(int k=1;k<=m;++k)
				{
					scanf("%c",map[i][j]+k);
					if(map[i][j][k]=='P')
						ez=i,ex=j,ey=k;
					else if(map[i][j][k]=='S')
						sz=i,sx=j,sy=k;
				}
				getchar();
			}
			if(!i)
				getchar();
		}
		int min_time=BFS();
		if(min_time==-1||(min_time>limit))
			printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-09 19:32:00

A计划 HDU杭电2102【广搜+STL队列】的相关文章

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很基础的一道题 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm

『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧,用心在自己的研究上.晚上级会开完也就八点多了,开始打打题,今天在HDU杭电的ACM集训题看到一个奇葩的题,前来献上. 今日推荐: <全球风暴> 一部宇宙航空和地球气候片的良心佳作,后期特效建模都是特别杠杠的大片,不会让你失望的哟,我已经三刷了哈哈哈.这部片在爱奇艺有上线,有兴趣的朋友可以看看鸭.

一个人的旅行 HDU杭电2066【dijkstra算法】

http://acm.hdu.edu.cn/showproblem.php?pid=2066 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女--眼看寒假就快到了,这么一大段时间,可不

一个人的旅行 HDU杭电2066【dijkstra算法 || SPFA】

http://acm.hdu.edu.cn/showproblem.php? pid=2066 Problem Description 尽管草儿是个路痴(就是在杭电待了一年多,竟然还会在校园里迷路的人.汗~),但是草儿仍然非常喜欢旅行,由于在旅途中 会遇见非常多人(白马王子.^0^),非常多事,还能丰富自己的阅历.还能够看漂亮的风景--草儿想去非常多地方.她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋.去纽约纯粹看雪景.去巴黎喝咖啡写信.去北京探望孟姜女--眼看寒假就快到了,这么一大段

HDU 4101 有意思的广搜

题意:在一个n*n的矩阵内,两个人想要找到一个 " 宝藏 ",用-1表示.其中有空地,每回合可任意穿梭,用0表示,有怪物,无法直接穿过,需要杀死,每回合砍1 HP,等于0时死亡,由两人从最外围开始,每人一回合行动,问谁能获得 "  宝藏  " . 题解: 看似博弈 ,同样可以从必胜状态考虑,当宝藏周围只剩下最后一圈血量为1的怪物时,  谁先打死那个怪物,谁就输了. 两人都不愿意杀死那只堵着宝藏门的第一只怪 ,所以两人的状态就是一直在砍门外面的怪,你一刀我一刀.所以我

VIJOS-P1340 拯救ice-cream(广搜+优先级队列)

题意:从s到m的最短时间.(“o"不能走,‘#’走一个花两个单位时间,‘.'走一个花一个单位时间) 思路:广搜和优先队列. 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <queue> 5 #define MAX 30 6 using namespace std; 7 8 struct pos 9 { 10 int x; 11 int y; 1

深搜 ,广搜,队列 nyoj 27 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水

畅通project续HDU杭电1874【dijkstra算法 || SPFA】

http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点,请你计算出要从起点到终点.最短须要行走多少距离. Input 本题目包括多组数据.请处理到文件结束. 每组数据第一行包括两个正