A计划(三维dfs)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

black-hole6

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值