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 }
原文地址:https://www.cnblogs.com/Dreamcaihao/p/2349617.html