可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在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
  思路:求最快到达步骤用广搜,题目要求的数据量并不大,两层每层最大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计划的更多相关文章

  1. hdu 2102 A计划

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

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

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

  3. hdu - 2102 A计划 (简单bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目还是不难,注意起点一定是(0,0,0),然后到达P点时间<=t都可以. 用一个3维字符数组存储图 ...

  4. hdu 2102 A计划(优先队列+dfs)

    改了好久,上午来实验室打出来了,运行就是不对,一直找啊找!还是没找到,最后突然停电了,打好的代码还没保存呢! 刚才来的时候又重新打了一遍!!!结果一个小小的错误wrong了好久!!! 在dfs值返回时 ...

  5. hdoj 2102 A计划

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

  6. hdu 2102 A计划(双层BFS)(具体解释)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...

  7. HDOJ 2102 A计划(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路分析: <1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索 ...

  8. HDU 2102 A计划 经典搜索

    A计划 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...

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

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

随机推荐

  1. C++ 梳理:跑通简单程序

    C++ 结合了三个编程流派: 过程式编程:C 特性,结构化语言,强调过程 面向对象编程:C++ 对于 C 语言的补充,一切皆对象,强调数据 泛型编程(generic programming):由 C+ ...

  2. 等了半年的AMD锐龙3000系列台式机处理器今天终于上市开卖了!

    第三代AMD锐龙台式机处理器参数:

  3. 如何使用和关闭onbeforeunload 默认的浏览器弹窗事件

    Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过 window.onunload来指定或者在<body>里指定.区别在于o ...

  4. POJ 2516Minimum Cost(最小费用流+特判)

    [题意]: 有N个人,M个仓库,每个人需要物品,个数都等于共同的K,仓库中有对应的K件物品的数量,随后给K个N*M矩阵(小写k, n, m表示K,N,M对应的子集),表明m个仓库到第n个人的位置运送k ...

  5. echars配置案例-reactnative

    option = { backgroundColor:'#fff', grid: { left: '3%', right: '4%', top:, bottom: '6%', containLabel ...

  6. 【oracle】update 某字段为null

    字段 = null 注意这个字段要可以为空

  7. (HK1-0)激活与配置摄像机

    HK使用手册 网络连接 激活与配置摄像机 网络摄像机可通过 SADP 软件.客户端软件和浏览器三种方式激活, 具体激活操作方式可参见<网络摄像机操作手册>. 1. 安装随机光盘或从官网下载 ...

  8. docker概述和安装及基本操作

    一:概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用 ...

  9. luogu_2480: 古代猪文

    洛谷:2480古代猪文 题意描述: 给定两个整数\(N,G\),求$G^{\sum_{k|n}C_n^k} mod 999911659 $. 数据范围: \(1\leq N\leq 10^9,1\le ...

  10. 如何计算假设检验的功效(power)和效应量(effect size)?

    做完一个假设检验之后,如果结果具有统计显著性,那么还需要继续计算其效应量,如果结果不具有统计显著性,并且还需要继续进行决策的话,那么需要计算功效. 功效(power):正确拒绝原假设的概率,记作1-β ...