POJ 3984 迷宫问题

解题思路:打印路径的模板题,有点意思。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 5;
 6 int mapp[maxn][maxn], dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
 7 int f = 0, r = 1; //f为头指针,r为尾指针
 8 
 9 struct node{
10     int x, y, pre; //pre存储前一步的下标,即存储路径
11 }q[maxn*maxn]; //注意这里q的大小不是maxn,而是maxn*maxn
12 
13 void print(int i)
14 {
15     if(q[i].pre != -1) //初始化时做过标记,当q[i].pre == -1表示已经输出完毕
16     {
17         print(q[i].pre); //这里的递归很巧妙,好好品味。
18         printf("(%d, %d)\n", q[i].x, q[i].y);
19     }
20     return ;
21 }
22 
23 void bfs(int x, int y)
24 {
25     q[f].x = x, q[f].y = y, q[f].pre = -1;
26 
27     while(f < r)
28     {
29         for(int i = 0; i < 4; i++)
30         {
31             int xx = q[f].x + dir[i][0];
32             int yy = q[f].y + dir[i][1];
33 
34             if(xx < 0 || xx >= 5 || yy < 0 || yy >= 5 || mapp[xx][yy]) continue;
35             mapp[xx][yy] = 1; //标记为已经走过
36             q[r].x = xx, q[r].y = yy, q[r].pre = f, r++;
37 
38             if(xx == 4 && yy == 4) print(f); //走到终点时倒退回去打印路径。
39         }
40         f ++; //一个元素出队列
41     }
42     return ;
43 }
44 
45 int main()
46 {
47     for(int i = 0; i < 5; i++)
48     for(int j = 0; j < 5; j++) scanf("%d", &mapp[i][j]);
49 
50     printf("(0, 0)\n");
51     bfs(0, 0);
52     printf("(4, 4)\n");
53     return 0;
54 }
View Code

 

posted on 2015-10-05 12:55  改写历史,倾尽天下  阅读(147)  评论(0编辑  收藏  举报

导航