HDU 2102 A计划(BFS)

Posted Yeader

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2102 A计划(BFS)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102

题目大意:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

解题思路:em....还是bfs,只是可以通过‘#’上下传送,其他都差不多。需要注意:当传送过去是‘*’(墙),或者传送过去是‘#’(传送机)这两种都算是传送失败了。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 const int N=15;
 6 
 7 int m,n,T;
 8 int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
 9 char map[N][N][5];
10 int vis[N][N][5];
11 
12 struct node{
13     int x,y,z,step;
14 }pre,now;
15 
16 bool bfs(){
17     queue<node>q;
18     now.x=now.y=now.z=1;
19     now.step=0;
20     q.push(now);
21     while(!q.empty()){
22         pre=q.front();
23         q.pop();
24         for(int i=0;i<4;i++){
25             int xx=pre.x+d[i][0];
26             int yy=pre.y+d[i][1];
27             int zz=pre.z;
28             int t=pre.step+1;
29             if(xx<1||yy<1||zz<1||xx>n||yy>m||zz>2||vis[xx][yy][zz]||map[xx][yy][zz]==*)
30                 continue;
31             vis[xx][yy][zz]=1;
32             if(map[xx][yy][zz]==#){
33                 if(zz==1)
34                     zz++;
35                 else
36                     zz--;
37                 //注意除了墙,如果另一层是传送机也不行,传来传去无限循环啊~ 
38                 if(vis[xx][yy][zz]||map[xx][yy][zz]==*||map[xx][yy][zz]==#)
39                     continue;
40                 vis[xx][yy][zz]=1;                            
41             }
42             if(map[xx][yy][zz]==P){
43                 if(t<=T)
44                     return true;
45                 return false;
46             }
47             now.x=xx;
48             now.y=yy;
49             now.z=zz;
50             now.step=t;
51             q.push(now);                    
52         }
53     }
54     return false;
55 }
56 
57 int main(){
58     int t;
59     scanf("%d",&t);
60     while(t--){
61         memset(vis,0,sizeof(vis));
62         scanf("%d%d%d",&n,&m,&T);
63         for(int k=1;k<=2;k++){
64             if(k!=1)
65                 getchar();
66             for(int i=1;i<=n;i++){
67                 getchar();
68                 for(int j=1;j<=m;j++){
69                     scanf("%c",&map[i][j][k]);
70                 }
71             }
72         }
73         if(bfs())
74             puts("YES");
75         else
76             puts("NO");
77     }
78     return 0;
79 }

 

以上是关于HDU 2102 A计划(BFS)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2102 A计划(两层地图的bfs)

HDU 2102 A计划 bfs

HDU_2102 A计划 BFS

A计划 hdu2102(BFS)

HDU 2102 A计划(BFS)

hdu 2102 A计划 具体题解 (BFS+优先队列)