题目链接

Problem Description

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

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

Input

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

Output

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

Sample Input

1

5 5 14

S#.

.#...

.....

****.

...#.

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

Sample Output

YES

题目分析:

相当于一个三维的数组来存储地图,如果当前点为'#',相当于是一个传输门,只能够向上或者向下移动,如果传输到的点为'*'墙的话,就不会进行这次的传输,并且此次的移动不话费时间。其余的点'.'表示能够移动没移动一步耗费一秒的时间,'P'表示结束的点。

代码:

#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int ex,ey,ez,tx,ty,tz,n,m,t,op;
int next1[4][2]= {{1,0},{-1,0},{0,1},{0,-1} };
char tu[2][12][12];
int bj[2][12][12];
struct Node
{
int x;
int y;
int z;
int step;
};
void bfs(int x,int y,int z)
{
memset(bj,0,sizeof(bj));
queue<Node>q;
Node pre,lst;
pre.x=x;
pre.y=y;
pre.z=z;
pre.step=0;
bj[pre.z][pre.x][pre.y]=1;
q.push(pre);
while(!q.empty())
{
pre=q.front();
q.pop();
if(tu[pre.z][pre.x][pre.y]=='P'&& pre.step<=t)//到达指定点后,做标记并返回
{
op=1;
return;
} for(int i=0; i<4; i++)
{
lst.x=pre.x+next1[i][0];
lst.y=pre.y+next1[i][1];
lst.step=pre.step+1;
if(lst.step>t)//步数超过范围,则直接返回
continue;
if( lst.x<0||lst.y<0||lst.x>=n||lst.y>=m )//所到达的点超过数组范围,返回
continue;
if( tu[pre.z][lst.x][lst.y]=='*' || bj[pre.z][lst.x][lst.y]==1 )
//走到墙壁或者当前点已经走过,返回
continue;
if( tu[pre.z][lst.x][lst.y]=='#')//当前为传输门的话
{
bj[pre.z][lst.x][lst.y]=1; //标记当前点已经走过
lst.z=(pre.z+1)%2; //在两层之间进行循环
if(bj[lst.z][lst.x][lst.y]==0)//又到达的那个点没有走过的话,标记并且入队
{
bj[lst.z][lst.x][lst.y]=1;
q.push(lst);
//continue;
} }
if( tu[pre.z][lst.x][lst.y]=='.'||tu[pre.z][lst.x][lst.y]=='P')//当前点可以走
{
lst.z=pre.z;
bj[lst.z][lst.x][lst.y]=1;
q.push(lst);
}
}
}
} int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&t);
for(int h=0; h<2; h++) //表示层数
for(int i=0; i<n; i++) //行数
for(int j=0; j<m; j++) //列数
cin>>tu[h][i][j];
for(i=0; i<n; ++i) //去掉肯定不能够到达的地方,减少循环的次数
{
for(j=0; j<m; ++j)
{
if(tu[0][i][j]=='#')//当前点为传输门,传输进去后还是传输门或者为墙
if(tu[1][i][j]=='*' || tu[1][i][j]=='#')
tu[0][i][j]=tu[1][i][j]='*';//则把当前点和传输后的点都设置为不能够走的墙
if(tu[1][i][j]=='#')//当前点为传输门,传输进去后还是传输门或者为墙
if(tu[0][i][j]=='*' || tu[0][i][j]=='#')
tu[0][i][j]=tu[1][i][j]='*';//则把当前点和传输后的点都设置为不能够走的墙
}
}
op=0;
bfs(0,0,0);
if(op==1)
printf("YES\n");
else
printf("NO\n");
}
}

HDU 2102 A计划 (深搜)的更多相关文章

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

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

  2. hdu 2102 A计划

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

  3. hdu 4740【模拟+深搜】.cpp

    题意: 给出老虎的起始点.方向和驴的起始点.方向.. 规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转.. 当转了一次还没路走就会停下来.. 问他们有没有可能在某一格相遇. ...

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

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

  5. hdu 1518 Square(深搜+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题目大意:根据题目所给的几条边,来判断是否能构成正方形,一个很好的深搜应用,注意剪枝,以防超时! ...

  6. HDU 2102 A计划 (BFS)

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

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

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

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

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

  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. 关于对JSON.parse()与JSON.stringify()的理解

    JSON.parse()与JSON.stringify()的区别   JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"nam ...

  2. [C/C++] C++ Primer学习笔记

    记录下自己掌握不清楚的概念和用法... Day 1 endl:具有输出换行的效果,并刷新与设备相关联的缓冲区. 注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出 ...

  3. mysql中LIKE和REGEXP

    mysql中LIKE和REGEXP都可以用来字符匹配 正则表达式REGEXP是为复杂搜索指定模式的强大方式. like用法   LIKE一般与通配符(%)和(_)两个使用 如例 SELECT prod ...

  4. 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

  5. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...

  6. php的数组转为对象

    有时候数组要转为对象操作,用对象的指向操作符,有两种方法 方法一: $arr=['a'=>10,'b'=>100,'c'=>'Hello']; $obj=(Object)$arr; ...

  7. 《Linux内核设计与实现》第3章读书笔记

    第三章 进程管理 一.进程 1.进程就是处于执行期的程序,但并不局限于可执行代码.实际上,进程是正在执行的程序代码的实时结果. 2.执行线程是在进程中活动的对象 每个线程拥有一个独立的计数器.进程栈. ...

  8. vue入门教程

    vue视频教程(对vue有个概览,要掌握vue-cli的用法,对vue-router,vuex有基本的概念) https://www.imooc.com/learn/1091 1. vue-cli v ...

  9. Java中JDK,JRE和JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  10. C++ 文本查询2.0(逻辑查询)

    代码实例实现了继承和友元之间的关系,以及为了隐藏实际继承实现,而实现的接口类,代码偏乱,楼主- -自看的(提醒作用) TextQuery.h // // Created by 徐爱东 on 17/7/ ...