zoukankan      html  css  js  c++  java
  • 迷宫问题 POJ

    题目链接: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 }
  • 相关阅读:
    有线电视网
    crash的数字表格
    编译安装软件步骤
    ansible剧本--实现一键部署nfs服务
    ansibile剧本---实现一键部署rsync备份服务
    Common Palindromes Aizu
    Common Palindromes Aizu
    Palisection CodeForces
    Palisection CodeForces
    浅谈Palindromic Tree——回文树(回文自动机)
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/11364937.html
Copyright © 2011-2022 走看看