可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在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

这个题搜的话也不难想象,只不过是三维的,我的代码主要是对P点的判断,第一次wa忘了‘p’也可以走,后两次是忘了,在传送的时候对‘p'点的判断,蠢啊

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath> typedef long long ll;
using namespace std;
char Map[3][15][15];
int vis[3][15][15];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int n,m,time;
int ex,ey,ez;
int flag;
bool check(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m)
{
return true;
}
else
{
return false;
}
}
void dfs(int z,int x,int y,int step)
{ if(x==ex&&y==ey&&z==ez)
{
if(step<=time)
{
flag=1;
}
return;
} for(int t=0;t<4;t++)
{
int xx=x+dir[t][0];
int yy=y+dir[t][1]; if(check(xx,yy)&&(Map[z][xx][yy]=='.'||Map[z][xx][yy]=='P')&&vis[z][xx][yy]==0)
{
vis[z][xx][yy]=1;
dfs(z,xx,yy,step+1);
vis[z][xx][yy]=0;
}
else if(check(xx,yy)&&Map[z][xx][yy]=='#'&&vis[z][xx][yy]==0)
{
if(z==0&&(Map[z+1][xx][yy]=='.'||Map[z+1][xx][yy]=='P')&&vis[z+1][xx][yy]==0)
{
vis[z][xx][yy]=1;
vis[z+1][xx][yy]=1;
dfs(z+1,xx,yy,step+1);
vis[z+1][xx][yy]=0;
vis[z][xx][yy]=0;
}
else if(z==1&&(Map[z-1][xx][yy]=='.'||Map[z-1][xx][yy]=='P')&&vis[z-1][xx][yy]==0)
{
vis[z-1][xx][yy]=1;
vis[z][xx][yy]=1;
dfs(z-1,xx,yy,step+1);
vis[z-1][xx][yy]=0;
vis[z][xx][yy]=0;
}
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
flag=0;
int sx,sy,sz;
cin>>n>>m>>time;
memset(vis,0,sizeof(vis)); getchar(); for(int t=0;t<n;t++)
{
scanf("%s",Map[0][t]);
}
for(int t=0;t<n;t++)
{
scanf("%s",Map[1][t]);
} for(int t=0;t<n;t++)
{
for(int j=0;j<m;j++)
{
if(Map[0][t][j]=='P')
{
ez=0;
ex=t;
ey=j; }
if(Map[0][t][j]=='S')
{
sz=0;
sx=t;
sy=j;
}
}
} for(int t=0;t<n;t++)
{
for(int j=0;j<m;j++)
{
if(Map[1][t][j]=='P')
{
ez=1;
ex=t;
ey=j; }
if(Map[1][t][j]=='S')
{
sz=1;
sx=t;
sy=j;
}
}
}
vis[sz][sx][sy]=1;
dfs(sz,sx,sy,0);
if(flag==1)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
} } return 0;
}

最新文章

  1. Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70)
  2. composer 的使用
  3. gcview使用
  4. MFC的GUI窗口使用Console输出函数printf(AllocConsole后,使用GetStdHandle取得句柄,然后就可以操作了)
  5. 史上最全面的FRM与CFA的区别对比分析,适合新人看
  6. .Net 垃圾回收机制原理(二)
  7. (转载)mysql查询今天、昨天、7天、近30天、本月、上一月数据
  8. phpStudy + JspStudy 2014.10.02 下载
  9. ActiveMQ(七)_伪集群和主从高可用使用(转)
  10. WPF中修改DataGrid单元格值并保存
  11. Java之递归方法的字符串回文问题
  12. Azkaban-2.5.0-部署与常见案例
  13. GSP事件探查器 无法进行跟踪的解决办法(场景之一)
  14. flask模板应用-自定义错误页面
  15. Kafka、RabbitMQ、RocketMQ等消息中间件的对比
  16. c++ sizeof,strlen, length
  17. Docker打DB2 9.7镜像采坑相关
  18. 【Java】Java-UTC-时间戳处理
  19. 【转】五分钟读懂大数据核心MapReduce架构及原理
  20. Android:手把手教你打造可缩放移动的ImageView(下)

热门文章

  1. Python3.7安装Django
  2. Luogu 3241 [HNOI2015]开店
  3. Linux命令累积
  4. JUnit 两日游
  5. [GO]随机数的使用
  6. (函数)实现strstr函数
  7. try-catch-finally对返回值的影响
  8. Controller级别的异常处理过滤器IExceptionFilter
  9. Nginx配置 简单写了个
  10. duilib入门简明教程 -- 自绘标题栏(5)