HDU 2102 A计划(BFS)
A计划
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7071 Accepted Submission(s): 1657
Problem Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
Input
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
Output
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
Sample Input
1 5 5 14
S*#*.
.#...
.....
****.
...#.
..*.P
#.*..
***..
...*.
*.#..
Sample Output
YES
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 5 char map[3][15][15]; 6 int vis[3][15][15]; 7 int step[3][15][15]; 8 9 struct point 10 { 11 int x,y,z; 12 13 }qu[350]; 14 15 int ei, ej, ek; 16 int M, N, T; 17 int d[4][2] = {{-1,0},{1,0},{0,1},{0,-1}}; 18 19 void bfs() 20 { 21 int k,front=-1,tail=-1; 22 qu[++front].x = 0; 23 qu[front].y = 0; 24 qu[front].z = 0; 25 vis[0][0][0] = 1; 26 27 while(tail < front) 28 { 29 point tmp1, tmp2; 30 tmp1 = qu[++tail]; 31 for(k=0; k<4; k++) 32 { 33 tmp2.x = tmp1.x; 34 tmp2.y = tmp1.y + d[k][0]; 35 tmp2.z = tmp1.z + d[k][1]; 36 if(tmp2.x>=0&&tmp2.x<2&&tmp2.y>=0&&tmp2.y<M&&tmp2.z>=0&&tmp2.z<N 37 &&map[tmp2.x][tmp2.y][tmp2.z]!='*'&&vis[tmp2.x][tmp2.y][tmp2.z]==0) 38 { 39 if(map[tmp2.x][tmp2.y][tmp2.z]=='#') 40 { 41 if(tmp2.x==0)tmp2.x = 1; 42 else tmp2.x = 0; 43 if(map[tmp2.x][tmp2.y][tmp2.z]=='#')continue; 44 if(map[tmp2.x][tmp2.y][tmp2.z]=='*')continue; 45 //当遇到时空传输机时,若传送的位置是墙或时空传输机时,就忽略掉 46 } 47 vis[tmp2.x][tmp2.y][tmp2.z] = 1; 48 step[tmp2.x][tmp2.y][tmp2.z] = step[tmp1.x][tmp1.y][tmp1.z] + 1; 49 qu[++front] = tmp2; 50 if(tmp2.x==ei && tmp2.y==ej && tmp2.z==ek) 51 { 52 if(step[tmp2.x][tmp2.y][tmp2.z]<=T) 53 cout<<"YES"<<endl; 54 else 55 cout<<"NO"<<endl; 56 return ; 57 } 58 } 59 } 60 } 61 cout<<"NO"<<endl; 62 } 63 64 void Initlation() 65 { 66 int i,j,k; 67 memset(vis, 0, sizeof(vis)); 68 memset(step, 0, sizeof(step)); 69 cin>>M>>N>>T; 70 for(i=0;i<2;i++) 71 { 72 for(j=0;j<M;j++) 73 { 74 for(k=0;k<N;k++) 75 { 76 cin>>map[i][j][k]; 77 if(map[i][j][k] == 'P') 78 { 79 ei = i; 80 ej = j; 81 ek = k; 82 } 83 } 84 } 85 } 86 } 87 88 int main() 89 { 90 int Case; 91 cin>>Case; 92 while(Case--) 93 { 94 Initlation(); 95 bfs(); 96 } 97 return 0; 98 }