这道题主要注意时空机这个位置,其他的都是bfs常见的:
1.当前位置为时空时,进入下一层,下一层的那个位置是时空机的话,不能走;
2.当前位置为时空机的话,进入下一层,下一层是墙也不能进入;
3.当前位置是时空机的话,进入下一层,下一层是空地,可以进入下一层。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define inf 99999
using namespace std;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
int n,m,k;
char e[3][33][33];
int vis[3][33][33];
int minstep;
int time;
struct node{
int x,y,z;
int step;
friend bool operator<(const node a,const node b){
return a.step>b.step;
}
};
int check(int x,int y,int z){
if(x>=1&&x<=n&&y<=m&&y>=1&&z<=2&&z>=1&&vis[z][x][y]==0&&e[z][x][y]!='*'){
return 1;
}else{
return 0;
}
}
int bfs(int x,int y,int z){
priority_queue<node>q;
node a;
a.x=x;
a.y=y;
a.z=z;
a.step=0;
vis[z][x][y]=1;
q.push(a);
while(!q.empty()){
node u=q.top();
q.pop();
if(e[u.z][u.x][u.y]=='P'){
return u.step;
}
for(int i=0;i<4;i++){
node t;
t.x=u.x+dx[i];
t.y=u.y+dy[i];
if(check(t.x,t.y,u.z)){
vis[u.z][t.x][t.y]=1;
if(e[u.z][t.x][t.y]=='#'){//当前为时空机的话
int d;
if(u.z==1){
d=2;
}else{
d=1;
}
if(vis[d][t.x][t.y]==0&&e[d][t.x][t.y]!='#'&&e[d][t.x][t.y]!='*'){//如果下一层不为时空机且墙的话,可以走
vis[d][t.x][t.y]=1;
t.z=d;
t.step=u.step+1;
q.push(t);
}
}else{
t.z=u.z;
t.step=u.step+1;
q.push(t);
}
}
}
}
return inf;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>m>>time;
memset(vis,0,sizeof(vis));
for(int i=1;i<=2;i++){
for(int j=1;j<=n;j++){
for(int z=1;z<=m;z++){
cin>>e[i][j][z];
}
}
}
int step=bfs(1,1,1);
if(step>time){
cout<<"NO"<<endl;
}else{
cout<<"YES"<<endl;
}
}
return 0;
}