有两个地图,#代表传送门,可以从一个地图到另一个地图的对应位置。如果对应位置是*就会死。
*代表墙,不能走。.代表路,从(0,0,0)开始,找到P,问能否在时间内找到
bfs的模式去搜索,但是遇到#传送,这里需要预处理地图
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
int vis[2][20][20],n,m,T,flag;
int dr[4][2]={1,0,-1,0,0,1,0,-1};
char mp[2][20][20];//三维数组,第一维代表第几个地图
struct node
{
int z,x,y,step;//z代表在第几个地图
};
void bfs()
{
node start;
int i,j;
start.z=0;start.x=0;
start.y=0;start.step=0;
queue<node>q;
q.push(start);
vis[0][0][0]=1;
while(!q.empty())
{
node now=q.front();
q.pop();
if(mp[now.z][now.x][now.y]=='P'&&now.step<=T)
{
printf("YES\n");
flag=1;
break;
}
node nt;
int nx,ny,nz;
for(i=0;i<4;i++)
{
nx=now.x+dr[i][0];
ny=now.y+dr[i][1];
nz=now.z;
if(nx>=0&&nx<n&&ny>=0&&ny<m&&!vis[nz][nx][ny])
{
if(mp[nz][nx][ny]!='*')
{
nt.x=nx;nt.y=ny;
nt.step=now.step+1;
vis[nz][nx][ny]=1;//标记走过
if(mp[nz][nx][ny]!='#')nt.z=nz;
else
{
nt.z=nz^1;
vis[nz][nx][ny]=1;//这里也要标记为走过
}
//走到#,不需要多花时间
q.push(nt);
}
}
}
}
}
int main()
{
int C,i,j,k;
scanf("%d",&C);
while(C--)
{
scanf("%d%d%d",&n,&m,&T);
for(k=0;k<2;k++)
{
for(i=0;i<n;i++)
scanf("%s",mp[k][i]);
}
for(k=0;k<2;k++)
{
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mp[k][i][j]=='#'&&mp[k^1][i][j]=='#')
mp[k][i][j]=mp[k^1][i][j]='*';
//两个传送门对应
if(mp[k][i][j]=='#'&&mp[k^1][i][j]=='*')
mp[k][i][j]='*';
//如果传送门对应墙,不能走
}
}
}
memset(vis,0,sizeof(vis));
flag=0;
bfs();
if(!flag)printf("NO\n");
}
return 0;
}