• 迷宫问题(bfs+记录路径)


    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105278#problem/K

    K - 迷宫问题
    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
    Submit Status

    Description

    定义一个二维数组: 

    int maze[5][5] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

    Input

    一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

    Output

    左上角到右下角的最短路径,格式如样例所示。

    Sample Input

    0 1 0 0 0
    0 1 0 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0

    Sample Output

    (0, 0)
    (1, 0)
    (2, 0)
    (2, 1)
    (2, 2)
    (2, 3)
    (2, 4)
    (3, 4)
    (4, 4)

    题解:注意暴力搜索记录路径的题,一个学到的很好的方法就是开一个数组记录当前节点的父亲节点,然后最后输出的时候,从最后一个点依次向前面找,按照父亲找父亲的方法找下去,最后就是路径了
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<stack>
     4 #include<queue>
     5 #include<string>
     6 using namespace std;
     7 int mp[5][5];
     8 struct Node{
     9     int x;
    10     int y;
    11 };
    12 Node fa[5][5];
    13 bool vis[5][5];
    14 bool ck(Node k)
    15 {
    16     if(k.x<=4&&k.x>=0&&k.y>=0&&k.y<=4) return true;
    17     return false;
    18 }
    19 
    20 int go[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
    21 
    22 void bfs(){
    23     queue<Node>q;
    24     memset(vis,0,sizeof(vis));
    25     Node tm;
    26     tm.x = 0;
    27     tm.y = 0;
    28     q.push(tm);
    29     vis[0][0] = 1;
    30     while(!q.empty()){
    31         Node tm1 = q.front();q.pop();
    32         Node fl;
    33         for(int i = 0; i < 4; i++){
    34             fl.x = tm1.x+go[i][0];
    35             fl.y = tm1.y+go[i][1];
    36             if(ck(fl)&&vis[fl.x][fl.y]==0&&mp[fl.x][fl.y]==0){
    37                 q.push(fl);
    38                 vis[fl.x][fl.y] = 1;
    39                 fa[fl.x][fl.y] = tm1;
    40             }
    41         }
    42     }
    43 }
    44 
    45 int main()
    46 {
    47     for(int i = 0; i < 5; i++)
    48         for(int j = 0; j < 5; j++)
    49             scanf("%d",&mp[i][j]);
    50     bfs();
    51     stack<Node>v;
    52     Node ff = fa[4][4];
    53     while(!(ff.x==0&&ff.y==0)){
    54         v.push(ff);
    55         ff = fa[ff.x][ff.y];
    56     }
    57     printf("(0, 0)
    ");
    58     while(!v.empty()){
    59         printf("(%d, %d)
    ",v.top().x,v.top().y);
    60         v.pop();
    61     }
    62     printf("(4, 4)
    ");
    63     return 0;
    64 }
  • 相关阅读:
    XML解析技术研究(一)
    Qt解析XML文件(QXmlStreamReader)
    Qt XML读取写入操作
    QT QXmlStreamWriter用法小结
    QtXML 举例
    libpcap使用
    PCAP研究
    粗谈pcap_next_ex()
    C#扇形的绘制与Hittest交互、图种制作
    ORA-01747: user.table.column, table.column 或列说明无效
  • 原文地址:https://www.cnblogs.com/shanyr/p/5204709.html
Copyright © 2020-2023  润新知