1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
YES
1::起点和终点可以在任意的位置,题目说是0,0,0,妈蛋。
2:两边都是传送门时,或者一边是传送门一边是墙时,这两种情况是死路。
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std; int time,n,m,ec,ex,ey,vis[2][20][20]; //题目说S在0,0,0 然而并不是 int sc,sx,sy; int fx[4][2]={0,1,1,0,0,-1,-1,0}; char map[2][20][20],tt[20]; struct node { int c,x,y,step; }; int check(node p) { if(p.c<0||p.c>1||p.x<0||p.y<0||p.x>=n||p.y>=m) return 0; if(vis[p.c][p.x][p.y])return 0; //对面不能是墙,且不能是传送 if(map[p.c][p.x][p.y]=='#'&&map[!p.c][p.x][p.y]!='*'&&map[!p.c][p.x][p.y]!='#') return 1; if(map[p.c][p.x][p.y]=='.'||map[p.c][p.x][p.y]=='P')return 1; return 0; } int bfs() { queue<node>Q; node t,p; t.c=sc; t.x=sx; t.y=sy; t.step=0; Q.push(t); while(!Q.empty()) { t=Q.front(); Q.pop(); if(t.c==ec&&t.x==ex&&t.y==ey) return t.step; for(int i=0;i<4;i++) { p.c=t.c; p.x=t.x+fx[i][0]; p.y=t.y+fx[i][1]; p.step=t.step+1; if(check(p)&&p.step<=time) { if(map[p.c][p.x][p.y]=='#') { vis[p.c][p.x][p.y]=1; p.c=!p.c; } Q.push(p); vis[p.c][p.x][p.y]=1; } } } return -1; } int main() { int T; scanf("%d",&T); while(T--) { memset(vis,0,sizeof(vis)); scanf("%d%d%d",&n,&m,&time); for(int i=0;i<n;i++) { scanf("%s",map[0][i]); for(int j=0;map[0][i][j];j++) { if(map[0][i][j]=='P'){ex=i;ey=j;ec=0;} if(map[0][i][j]=='S'){sx=i;sy=j;sc=0;} } } for(int i=0;i<n;i++) { scanf("%s",map[1][i]); for(int j=0;map[1][i][j];j++) { if(map[1][i][j]=='P'){ex=i;ey=j;ec=1;} if(map[1][i][j]=='S'){sx=i;sy=j;sc=1;} } } if(bfs()!=-1) printf("YES\n"); else printf("NO\n"); } return 0; }