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)的主要内容,如果未能解决你的问题,请参考以下文章