这道题是一道bfs的题目,因为题目中给的数据很小,所以可以采用优先队列的方式来简化处理。这道题在搜索的过程中要注意map1的不同层次的转换,即对'#'的理解。之前wa了两次是因为我考虑了如果上下两层对应位置都是'#'时输出'NO’,但是这是错误的,可以不考虑这个问题,也可以当上下两层都是‘#’时将它们赋成‘*’;

具体步骤看程序及程序上的注释:

#include"iostream"
#include"stdio.h"
#include"cmath"
#include"string.h"
#include"queue"
#include"algorithm"
#define mx 15
using namespace std;
char map1[mx][mx][];//三维的地图
int dir[][]={{,},{,-},{-,},{,}};//上下左右四个方向
int n,m,t,sx,sy,sz,ex,ey,ez;
struct node
{
int x,y,z,time;
friend bool operator<(node a,node b)//优先队列中的元素按时间的从小到大排序
{
return b.time<a.time;
}
};
int judge(int x,int y,int z)//判断当前位置的情况
{
if(x>=&&x<n&&y>=&&y<m)
{
if(map1[x][y][z]=='.') return ;
else if(map1[x][y][z]=='#') return ;
else return -;
}
else return -;
}
void bfs()
{
priority_queue<node> q;//构造优先队列
node cur,next;
int i;
cur.x=sx;
cur.y=sy;
cur.z=sz;
cur.time=;
q.push(cur);
while(!q.empty())//队列非空就进行循环
{
cur=q.top();
q.pop();//记得出队列
if(cur.x==ex&&cur.y==ey&&cur.z==ez&&cur.time<=t)//找到了目标位置就输出并返回
{cout<<"YES"<<endl;return;}
for(i=;i<;i++)
{
next.x=cur.x+dir[i][];
next.y=cur.y+dir[i][];
next.z=cur.z;
int re=judge(next.x,next.y,next.z);//判断走过一步后的情况
if(re==-) continue;
else
{
if(re==)
{
map1[next.x][next.y][next.z]='*';
next.time=cur.time+;
q.push(next);
}
else if(re==)
{
next.z=(cur.z+)%;
re=judge(next.x,next.y,next.z);//判断时空隧道的对应位置是什么
if(re==)
{ next.time=cur.time+;map1[next.x][next.y][next.z]='*';q.push(next);}
}
}
}
}
cout<<"NO"<<endl;
}
int main()
{
int c;
cin>>c;
while(c--)
{
int i,j,k;
cin>>n>>m>>t;
for(k=;k<=;k++)
{
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
cin>>map1[i][j][k];
if(map1[i][j][k]=='S')
{
sx=i;sy=j;sz=k;
map1[i][j][k]='*';
}
else if(map1[i][j][k]=='P')
{
map1[i][j][k]='.';
ex=i;ey=j;ez=k;
}
}
}
if(k==)getchar();////注意在输入过程中的空格
}
bfs();
}
return ;
}

hdu A计划的更多相关文章

  1. hdu 2102 A计划

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...

  2. [HDU 2102] A计划(搜索题,典型dfs or bfs)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. A计划 HDU - 2102

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. HDU 2102 A计划(BFS/DFS走迷宫)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. HDU 2102 A计划(两层地图加时间限制加传送门的bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  6. HDU 2102 A计划 (BFS)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. I - A计划 HDU - 2102

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. hdu 2102 A计划-bfs

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

随机推荐

  1. 75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。[2行核心代码]

    [本文链接] http://www.cnblogs.com/hellogiser/p/single-number-of-array-with-other-three-times.html [题目] i ...

  2. JsRender语法

    {{:#data.Name}} 或 {{:Name}} 直接显示html格式{{>#data.Name}} 或 {{>Name}} 转义显示html字符 if else {{if bool ...

  3. 分页管理的AJAX实现

    bookMgr.jsp <%-- Document : bookMgr.jsp Created on : 2016-11-7, 9:48:21 Author : guanghe --%> ...

  4. Markdown 语法速查表

      Markdown 语法速查表 1 标题与文字格式 标题 # 这是 H1 <一级标题> ## 这是 H2 <二级标题> ###### 这是 H6 <六级标题> 文 ...

  5. MVC准备前基础知识

    一.自动属性C#自动属性可以避免原来这样我们手工声明一个私有成员变量以及编写get/set逻辑public class Product{ public int Id { get; set; } pub ...

  6. [转]使用VC/MFC创建一个线程池

    许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...

  7. svn update 每更新一项就输出一行信息,使用首字符来报告执行的动作 这些字符的含义是:

    A 已添加 D 已删除 U 已更新 C 合并冲突 G 合并成功 例子: [root@ok 资料库]# svn ci -m "" Sending 资料库/简历 Transmittin ...

  8. Nginx 服务器安装及配置文件详解

    原文出处: Sean Chow(@SeanLoook)   欢迎分享原创到伯乐头条 Nginx 在工作中已经有好几个环境在使用了,每次都是重新去网上找博客,各种编译配置,今天自己也整理一份安装文档和 ...

  9. 【HTML5】Canvas画布

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  10. ls命令

    ls(list) 命令可以说是Linux下最常用的命令之一 #ls -l;列出文件的详细信息 #ll 以上两个命令一样,ll是ls -l的简写 #ls -al;列出目录下的所有文件,包括以 . 开头的 ...