迷宫问题 POJ - 3984(bfs+记录路径)

题目链接:http://poj.org/problem?id=3984

题意:从(0,0)走到(4,4)的最短路径,该路仅一定存在

思路:记录每个子节点的父节点的下标,从(4,4)结点依次往上寻找父节点,存到栈里,再用栈输出

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 #include <algorithm>
 6 #include <cmath>
 7 #include <map>
 8 #include <stack>
 9 #define mem(a,b) memset(a,b,sizeof(a));
10 using namespace std;
11 #define INF 0x3f3f3f3f
12 typedef long long ll;
13 int dir[4][2] = {0,1,0,-1,1,0,-1,0};
14 const int maxn = 2005;
15 int a[10][10],ans;
16 struct Node{
17     int x,y,t,ft;
18     Node(){};
19     Node(int x1,int y1,int t1,int f1):x(x1),y(y1),t(t1),ft(f1){};
20 }p[maxn];
21 
22 struct node {
23     int x,y;
24     node(int x1,int y1):x(x1),y(y1){};
25 };
26 bool vis[10][10];//标记该点是否走过,防止重复走
27 void bfs(int x,int y){
28     p[0].x = x,p[0].y = y,p[0].t = 0;
29     queue<Node>q;
30     q.push(Node(x,y,0,0));//起点入队列
31     vis[x][y] = 1;
32     int k = 0;
33     while(!q.empty()) {
34         Node temp = q.front();
35         q.pop();
36         if(temp.x == 4 && temp.y == 4){
37             ans = temp.t;//找到最终结点的下标
38             break;
39         }
40         for(int i = 0; i < 4; i++) {
41             int sx = temp.x + dir[i][0], sy = temp.y + dir[i][1];
42             if(!vis[sx][sy] && a[sx][sy] == 0 && sx >=0 && sx < 5 && sy >= 0&& sy < 5) {
43                 k++;//数组里当前结点的下标
44                 vis[sx][sy] = 1;
45                // cout << sx << " " << sy <<endl;
46                 p[k].x = sx,p[k].y = sy,p[k].t = k, p[k].ft = temp.t;//ft存父节点的下标
47                 q.push(Node(p[k].x,p[k].y,p[k].t,p[k].ft));
48             }
49         }
50     }
51 }
52 int main()
53 {
54     for(int i = 0; i < 5; i++) {
55         for(int j = 0; j < 5; j++) {
56             cin >> a[i][j];
57         }
58     }//输入
59     bfs(0,0);
60     stack<node>m;
61     int zx,zy;
62     zx = p[ans].x, zy = p[ans].y;//ans最后一个结点的坐标
63     m.push(node(zx,zy));//入栈
64     int zz;
65     while(1){
66         ans = p[ans].ft;//找到当前结点的父节点的下标
67         zz = p[ans].t;//当前结点
68         zx = p[ans].x, zy = p[ans].y;
69         m.push(node(zx,zy));//入栈
70         if(zz == 0)
71             break;//如果当前结点是起点,退出
72     }
73     while(!m.empty()) {//输出
74         node temp = m.top();
75         m.pop();
76         cout << "(" << temp.x <<", "<<temp.y<<")" << endl;
77     }
78     return 0;
79 }

 

posted on 2019-08-16 16:51  一只小毛球  阅读(708)  评论(0编辑  收藏  举报

导航