简单的BFS,但是这道题需要考虑很多细节,比如说#传送门不计算时间消耗,还有当#另一层是#或*是不可以走的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int N=10+2;
const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
int n,m,t;
char g[2][N][N];
int vis[2*N*N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&t);
for(int i=0;i<n;i++)
scanf("%s",g[0][i]);
for(int i=0;i<n;i++)
scanf("%s",g[1][i]);
int p;
memset(vis,-1,sizeof(vis));
queue<int> q;
for(int k=0;k<2;k++)
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[k][i][j]=='P') p=k*100+i*10+j; //终点
vis[0]=0;
q.push(0);
while(!q.empty())
{
int u=q.front();
q.pop();
if(u==p) break;
int uk=u/100;
int ux=u%100/10;
int uy=u%10;
for(int i=0;i<4;i++)
{
int nk=uk;
int nx=ux+dx[i];
int ny=uy+dy[i];
int v=nk*100+nx*10+ny;
if(nx<0||ny<0||nx>=n||ny>=m||g[nk][nx][ny]=='*'||vis[v]!=-1||(g[nk][nx][ny]=='#'&&(g[nk^1][nx][ny]=='*'||g[nk^1][nx][ny]=='#'))) continue;
vis[v]=vis[u]+1;
if(g[nk][nx][ny]=='#'&&g[nk^1][nx][ny]!='*'&&g[nk^1][nx][ny]!='#')
{
nk^=1;
v=nk*100+nx*10+ny;
vis[v]=vis[u]+1;
}
q.push(v);
}
}
if(vis[p]>t||vis[p]==-1) printf("NO\n");
else printf("YES\n");
}
return 0;
}