HDOJ 2102
如果传送门'#'的另一层是传送门'#'或者是墙'*',就可以理解为这两层的这个位置都是'*'了
还有就是传送门'#'传过去可以是空地'.' 也可以是目的地'P',不要忽略了
1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <queue> 6 using namespace std; 7 8 struct node 9 { 10 int x,y,floo; 11 int time; 12 }; 13 14 char map[2][20][20]; 15 int visited[2][20][20]; 16 int walk[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 17 int n,m,t; 18 19 int bfs() 20 { 21 queue<node>Q; 22 node u; 23 u.x=0; 24 u.y=0; 25 u.floo=0; 26 u.time=0; 27 Q.push(u); 28 visited[0][0][0]=1; 29 while(!Q.empty()) 30 { 31 u=Q.front(); 32 Q.pop(); 33 if(u.time==t) continue; 34 for(int i=0;i<4;++i) 35 { 36 int xx=u.x+walk[i][0]; 37 int yy=u.y+walk[i][1]; 38 if(xx>-1&&xx<n&&yy>-1&&yy<m&& (!visited[u.floo][xx][yy])) 39 { 40 if(map[u.floo][xx][yy]=='*') continue; 41 if(map[u.floo][xx][yy]=='P') return 1; 42 43 //下面这句一开始写成了if(map[u.floo][xx][yy]=='.'&&(!visited[u.floo][xx][yy])) 44 //忽略了如果是(1&&0)的话,就会把'.'当成'#'处理 45 if(map[u.floo][xx][yy]=='.') 46 { 47 node v; 48 v.x=xx; 49 v.y=yy; 50 v.floo=u.floo; 51 v.time=u.time+1; 52 Q.push(v); 53 visited[v.floo][v.x][v.y]=1; 54 } 55 else 56 { 57 int f=!u.floo; 58 if(map[f][xx][yy]=='P') return 1; 59 if(map[f][xx][yy]=='.' && (!visited[f][xx][yy])) 60 { 61 node v; 62 v.x=xx; 63 v.y=yy; 64 v.floo=f; 65 v.time=u.time+1; 66 Q.push(v); 67 visited[v.floo][v.x][v.y]=1; 68 //visited[u.floo][xx][yy]=1; 69 } 70 } 71 } 72 } 73 } 74 return 0; 75 } 76 77 int main() 78 { 79 int c; 80 81 scanf("%d",&c); 82 while(c--) 83 { 84 scanf("%d %d %d",&n,&m,&t); 85 for(int k=0;k<2;++k) 86 { 87 for(int i=0;i<n;++i) 88 { 89 scanf("%s",&map[k][i]); 90 } 91 } 92 memset(visited,0,sizeof(visited)); 93 if(bfs()) printf("YES\n"); 94 else printf("NO\n"); 95 } 96 }
浙公网安备 33010602011771号