可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在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. 织梦dedecms后台文件media_add.php任意上传漏洞解决办法

    织梦在安装到阿里云服务器后阿里云后台会提示media_add.php后台文件任意上传漏洞,引起的文件是后台管理目录下的media_add.php文件,下面跟大家分享一下这个漏洞的修复方法: 首先找到并 ...

  2. 第二阶段冲刺(个人)——two

    今天的计划: 测试登录功能并优化. 昨天做了什么呢?  修改登录界面. 遇到的困难:一些标签运用不好,过程进度慢,改了又改.

  3. 回溯法 | n皇后问题

    今早上看了一篇英语阅读之后,莫名有些空虚寂寞冷.拿出算法书,研读回溯法.我觉得n皇后问题完全可以用暴力方式,即先对n个数进行全排列,得到所有结果的下标组合,问题规模为n!. 全排列花了比较久的时间才编 ...

  4. shell中echo输出换行的方法

    [~]#echo "Hello world.\nHello sea" Hello world.\nHello sea [~]#echo -e "Hello world.\ ...

  5. [原创]Emmagee V2.4工具使用介绍

    [原创]Emmagee V2.4工具使用介绍 1 Emmagee 介绍 Emmagee 是网易杭州研究院 QA团队开发的一款简单易上手的Android性能监控App,主要用于监控单个App的CPU.内 ...

  6. 重置jenkins用户名密码

    忘记用户名密码(如图)不管是忘记用户名密码还是误删jenkins目录下的users文件都可以使用下面的方式找回密码,我的版本是Jenkins 2.134 1.     进入jenkins安装目录,我的 ...

  7. shell脚本监控k8s集群job状态,若出现error通过触发阿里云的进程监控报警

    #!/bin/bash while [ 1 ] do job_error_no=`kubectl get pod -n weifeng |grep -i "job"|grep -c ...

  8. sbt 安装

    此次安装实在windows 下进行的 1.官网下载sbt 2.安装并配置环境变量 path  中添加: 3.更改sbt配置文件 1)修改C:\notos\software\sbt\conf\sbtco ...

  9. odoo13 searchpanel tree

    <record id="view_department_filter" model="ir.ui.view"> <field name=&qu ...

  10. IDEA中Tomcat部署时war和war exploded区别

    原理说明 war模式:将WEB工程以包的形式上传到服务器 :war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器: 含义解释 war模式这种可以称之为是发布模式,看名字也知道, ...