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 }

 

posted @ 2013-12-22 02:05  forkbomb  阅读(213)  评论(0)    收藏  举报