1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
YES#include <stdio.h> #include <string.h> #include <queue> #include <algorithm> using namespace std; struct node { int x,y,floor; int step; }; int t,n,m,lim; int s[3],e[3]; int to[4][2] = {1,0,0,1,-1,0,0,-1}; char map[2][15][15]; int vis[2][15][15]; int check(int floor,int x,int y) { if(x<0 || y<0 || x>=n || y>=m) return 1; if(map[floor][x][y]=='*') return 1; return 0; } void bfs() { memset(vis,0,sizeof(vis)); node a,next; queue<node> Q; int i,j,k; a.floor = s[0]; a.x = s[1]; a.y = s[2]; a.step = 0; vis[s[0]][s[1]][s[2]] = 1; Q.push(a); while(!Q.empty()) { a = Q.front(); Q.pop(); if(a.floor == e[0] && a.x == e[1] && a.y == e[2]) { printf("YES\n"); return ; } if(a.step>=lim) break; for(i = 0; i<4; i++) { next = a; next.x+=to[i][0]; next.y+=to[i][1]; next.step++; if(check(next.floor,next.x,next.y)) continue; if(vis[next.floor][next.x][next.y]) continue; vis[next.floor][next.x][next.y] = 1; if(map[next.floor][next.x][next.y] == '#') { next.floor=!next.floor; if(check(next.floor,next.x,next.y)) continue; if(vis[next.floor][next.x][next.y]) continue; if(map[next.floor][next.x][next.y] == '*' || map[next.floor][next.x][next.y] == '#') continue; vis[next.floor][next.x][next.y] = 1; } if(next.floor == e[0] && next.x == e[1] && next.y == e[2]) { printf("YES\n"); return ; } Q.push(next); } } printf("NO\n"); } int main() { int i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&lim); for(k = 0; k<2; k++) { for(i = 0; i<n; i++) { scanf("%s",map[k][i]); for(j = 0; j<m; j++) { if(map[k][i][j] == 'S') { s[0] = k,s[1] = i,s[2] = j; } else if(map[k][i][j] == 'P') { e[0] = k,e[1] = i,e[2] = j; } } } } bfs(); } return 0; }
原文地址:http://blog.csdn.net/libin56842/article/details/41909401