poj 2102 A计划
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是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
思路:求最快到达步骤用广搜,题目要求的数据量并不大,两层每层最大10×10,暴力搜索即可,再加上vis数组标记已到过的点。注意'#'直接就传走了进入另一层且不消耗时间
,判断下在另一层中与'#'对应的位置是不是墙,是墙就不能通过。代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
int n,m,t;
int sx,sy,sz,ex,ey,ez;
char mp[][][];//数据量小,可以直接设
int td[][]={,,,-,,,-,};//移动数组,方便运算
int vis[][][];//标记数组
bool judge(int x,int y,int z)//判断该点是否合法
{
return x<n&&x>=&&y<m&&y>=&&z<&&z>=;
}
struct node{//存放下标和步数
int x,y,z;
int step;
};
queue<node>q;
int bfs()
{
vis[sz][sx][sy]=;//将第一步设为已来过
node p;//初始化信息
p.x=sx,p.y=sy,p.z=sz;
p.step=;
while(!q.empty())q.pop();//清空队列
q.push(p);
while(!q.empty())
{
p=q.front();q.pop();
if(p.x==ex&&p.y==ey&&p.z==ez)return p.step;//找到公主时返回步数,根据队列先进先出的特征,该步数必为最少步数
for(int i=;i<;i++)//进行移动
{
int nx=p.x+td[i][];
int ny=p.y+td[i][];
if(mp[p.z][nx][ny]!='*'&&vis[p.z][nx][ny]==&&judge(nx,ny,p.z))//移动后位置合法时
{
vis[p.z][nx][ny]=;//更新数组信息
if(mp[p.z][nx][ny]=='#')//如果走到了传送门
{
if(p.z==){//在第0层时
if(mp[][nx][ny]!='*'&&mp[][nx][ny]!='#'&&vis[][nx][ny]==)//注意两层相同的位置不能都是传送门
{
vis[][nx][ny]=;
node pp;
pp.x=nx,pp.y=ny;
pp.z=;
pp.step=p.step+;
q.push(pp);
}
}
else if(p.z==)//在第一层时
{
if(mp[][nx][ny]!='*'&&mp[][nx][ny]!='#'&&vis[][nx][ny]==)
{
vis[][nx][ny]=;
node pp;
pp.x=nx,pp.y=ny;
pp.z=;
pp.step=p.step+;
q.push(pp);
}
}
}
else{
node pp;
pp.x=nx,pp.y=ny;
pp.z=p.z;
pp.step=p.step+;
q.push(pp);
}
}
}
}
return ;
}
int main()
{
int c;
scanf("%d",&c);
while(c--)
{
scanf("%d %d %d",&n,&m,&t);
for(int i=;i<;i++)
{
for(int j=;j<n;j++)
{
for(int k=;k<m;k++)
{
cin>>mp[i][j][k];
if(mp[i][j][k]=='S')sx=j,sy=k,sz=i;
if(mp[i][j][k]=='P')ex=j,ey=k,ez=i;
}
}
}
memset(vis,,sizeof(vis));//初始化标记数组
int f=bfs();
if(f<=t&&f!=)printf("YES\n");
else printf("NO\n");
}
return ;
}
poj 2102 A计划的更多相关文章
- hdu 2102 A计划
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...
- HDU 2102 A计划(两层地图加时间限制加传送门的bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others) Me ...
- hdu - 2102 A计划 (简单bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目还是不难,注意起点一定是(0,0,0),然后到达P点时间<=t都可以. 用一个3维字符数组存储图 ...
- hdu 2102 A计划(优先队列+dfs)
改了好久,上午来实验室打出来了,运行就是不对,一直找啊找!还是没找到,最后突然停电了,打好的代码还没保存呢! 刚才来的时候又重新打了一遍!!!结果一个小小的错误wrong了好久!!! 在dfs值返回时 ...
- hdoj 2102 A计划
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 2102 A计划(双层BFS)(具体解释)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...
- HDOJ 2102 A计划(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路分析: <1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索 ...
- HDU 2102 A计划 经典搜索
A计划 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- [HDU 2102] A计划(搜索题,典型dfs or bfs)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- Python面试题(1)
1.如何反向迭代一个序列 #如果是一个list,最快的方法使用reversetempList = [1,2,3,4]tempList.reverse()for x in tempList: pr ...
- 201871010128-杨丽霞《面向对象程序设计(java)》第二周学习总结
201871010128-杨丽霞<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <https://www.cnblogs.com/nwnu-daiz ...
- Django 缓存配置的多种方式
django 的缓存配置有多种方式,主要包含以下几种: 1.开发调试模式 2.内存模式 3.使用文件 4.直接使用数据库 5.使用redis或者memcache 这里主要是记录一下那些不常用,但是在微 ...
- Python基础之输出格式和If判断
格式化输出的三种方式 一.占位符 #占位符 name = 'nick' age = 19 print('my name is %s my age is %s' % (name, age)) age = ...
- 关于时间排序在ios中失效的处理方法
上个月公司做项目的时候在列表排序的时候产品加了一个需求,通过点击量,发布时间,评论量进行筛选的一个需求. 一开始在电脑上测试基本没问题,然后我也就放下了这个按耐不住的小心脏,然后在完成所有模块后 sh ...
- IO多路复用——poll
1.基本知识 poll是Linux中的字符设备驱动中的一个函数.Linux 2.5.44版本后,poll被epoll取代.和select实现的功能差不多,poll的作用是把当前的文件指针挂到等待队列. ...
- Excel地址
这题想了一个小时,也只得了66分,并且是一道看起来很简单的题…… 贴出代码,留给日后的自己 #include <stdio.h> #include <memory.h> #in ...
- git使用问题与技巧
1.修改gitolite管理员 如果gitolite原来的管理员已经没了,那么需要把当前的公钥放到服务器覆盖,然后替换目录下.ssh/authorized_keys内容 2.clone报告超过限制 w ...
- java基础 JDBC & Statement & PreparedStatement
参考文章: http://blog.csdn.net/wang379275614/article/details/23393335 概念 JDBC-数据库连接,是由一些类和接口构成的API,是J2SE ...
- BuaaRedSun团队博客目录——北航社团项目
目录 一.Scrum Meeting 1. Alpha 2. Beta 3. Gamma 二.测试报告 三.发布说明 四.技术博客 后端 前端 五.习得的软工原理/方法/技能? Alpha Beta ...