简单的3维BFS
大写的YES和NO,这心粗的....唉
#include<iostream> #include<cstdio> #include<queue> using namespace std; char map[2][12][12]; int d[2][3]; int dir[4][2]={0,1,0,-1,-1,0,1,0}; int n,m,t; struct node{ int x,y,z; int step; }; int bfs(){ queue<node>q; node cur,next; cur.z=d[0][0]; cur.x=d[0][1]; cur.y=d[0][2]; cur.step=t; q.push(cur); while(!q.empty()){ cur=q.front(); q.pop(); if(cur.z==d[1][0]&&cur.x==d[1][1]&&cur.y==d[1][2]){ if(cur.step>=0) return 1; return 0; } for(int i=0;i<4;i++){ next.x=dir[i][0]+cur.x; next.y=dir[i][1]+cur.y; next.z=cur.z; if(map[next.z][next.x][next.y]=='#'){ if(next.z) next.z=0; else next.z=1; } if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&map[next.z][next.x][next.y]!='*'){ next.step=cur.step-1; map[next.z][next.x][next.y]='*'; q.push(next); } } } return 0; } int main(){ //freopen("2102.in", "r", stdin); int c,i,j,k; cin>>c; while(c--){ cin>>n>>m>>t; for(i=0;i<2;i++){ for(j=0;j<n;j++){ scanf("%s",map[i][j]); for(k=0;k<m;k++){ if(map[i][j][k]=='S'){ d[0][0]=i; d[0][1]=j; d[0][2]=k; } else if(map[i][j][k]=='P'){ d[1][0]=i; d[1][1]=j; d[1][2]=k; } else if(i&&map[i][j][k]=='*'&&map[0][j][k]=='#') //2层是墙,不能传过来 map[0][j][k]='*'; else if(i&&map[i][j][k]=='#'&&(map[0][j][k]=='#'||map[0][j][k]=='*')){ map[0][j][k]='*'; //2层是传送机 map[1][j][k]='*'; } } } } if(bfs()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }