迷宫问题 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 }