由于是中文题,我就不写题意了;
这道题dfs和bfs都可以做;
题解:
(1)超出地图范围肯定不行;
(2)碰到‘#’必传送;
(3)‘#’和‘#’肯定是死路;
(4)‘#’和‘*’死路;
(5)注意‘#’过去是‘P’
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 20;
char Map[2][maxn][maxn];//z,x,y
int vis[2][maxn][maxn];
int n,m,t,sx,sy,sz,xx,yy,zz;
struct node{
int x,y,z,st;
};
int dr[]={1,0,-1,0};
int dc[]={0,-1,0,1};
int judge(int dx,int dy,int dz){
if(dx>=0&&dx<n&&dy>=0&&dy<m&&dz>=0&&dz<2&&vis[dz][dx][dy]==-1&&Map[dz][dx][dy]!='*'){
if(Map[dz][dx][dy]=='#'){
if(dz==0&&Map[1][dx][dy]=='#')return 0;
else if(dz==1&&Map[0][dx][dy]=='#')return 0;
else if(dz==0&&Map[1][dx][dy]=='*')return 0;
else if(dz==1&&Map[0][dx][dy]=='*')return 0;
else if(dz==1&&Map[0][dx][dy]=='.')return 1;
else if(dz==0&&Map[1][dx][dy]=='.')return 1;
else if(dz==0&&Map[1][dx][dy]=='P')return 1;
else if(dz==1&&Map[0][dx][dy]=='P')return 1;
}
else return 1;
}
else return 0;
}
bool bfs(){
queue<node>q;
node s,e;
s.x=xx;s.y=yy;s.z=zz;s.st=0;
q.push(s);
vis[zz][xx][yy]=0;
while(!q.empty()){
s=q.front();
q.pop();
if(s.x==sx&&s.y==sy&&s.z==sz&&s.st<=t)return true;
for(int i=0;i<4;i++){
int dx=s.x+dr[i];
int dy=s.y+dc[i];
int dz=s.z;
if(judge(dx,dy,dz)){
if(Map[dz][dx][dy]=='#'){
vis[dz][dx][dy]=s.st+1;
if(dz)dz=0;
else dz=1;
vis[dz][dx][dy]=s.st+1;
e.x=dx;e.y=dy;e.z=dz;e.st=s.st+1;
q.push(e);
}
else{
vis[dz][dx][dy]=s.st+1;
e.x=dx;e.y=dy;e.z=dz;e.st=s.st+1;
q.push(e);
}
}
}
}
return false;
}
int main(){
int c;
cin>>c;
while(c--){
cin>>n>>m>>t;
for(int i=0;i<2;i++){
for(int j=0;j<n;j++){
cin>>Map[i][j];
for(int k=0;k<m;k++){
if(Map[i][j][k]=='P'){
sx=j;sy=k;sz=i;
}
if(Map[i][j][k]=='S'){
xx=j;yy=k;zz=i;
}
}
}
}
memset(vis,-1,sizeof(vis));
if(bfs())cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}