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

    迷宫问题

    定义一个二维数组: 

    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 <iostream>
     2 #include <string>
     3 #include <cstring>
     4 #include <queue>
     5 #include <cstdio>
     6 
     7 using namespace std;
     8 
     9 int maze[5][5];
    10 int vis[5][5];
    11 int dx[] = { 1,-1,0,0 };
    12 int dy[] = { 0,0,1,-1 };
    13 pair<int, int> father[6][6];    // father[i][j]表示点(i, j)的父节点的坐标 
    14 
    15 struct node
    16 {
    17     int x, y;
    18 };
    19 
    20 void print(pair<int,int> p)
    21 {
    22     if (p.first == 0 && p.second == 0)
    23         return;
    24     else
    25     {
    26         print(father[p.first][p.second]);
    27         printf("(%d, %d)
    ", father[p.first][p.second].first, father[p.first][p.second].second);
    28     }
    29 }
    30 
    31 
    32 int main()
    33 {
    34     for (int i = 0; i < 5; ++i)
    35         for (int j = 0; j < 5; ++j)
    36             cin >> maze[i][j];
    37     memset(vis, 0, sizeof(vis));
    38 
    39     node nod;
    40     nod.x = nod.y = 0;
    41     node t, p;
    42     queue<node> Q;
    43     Q.push(nod);
    44     vis[0][0] = 1;
    45 
    46     while (!Q.empty())
    47     {
    48         t = Q.front();
    49         Q.pop();
    50 
    51         if (t.x == 4 && t.y == 4)
    52         {
    53             print(make_pair(4, 4));
    54             cout << "(4, 4)" << endl;
    55             break;
    56         }
    57 
    58         for (int i = 0; i < 4; ++i)
    59         {
    60             int xx = t.x + dx[i];
    61             int yy = t.y + dy[i];
    62 
    63             if (xx >= 0 && xx < 5 && yy >= 0 && yy < 5 && maze[xx][yy] != 1 && !vis[xx][yy])
    64             {
    65                 vis[xx][yy] = 1;
    66                 p.x = xx;
    67                 p.y = yy;
    68                 father[p.x][p.y] = make_pair(t.x, t.y);
    69                 Q.push(p);
    70             }
    71         }
    72     }
    73 
    74 
    75     return 0;
    76 }
  • 相关阅读:
    阿里巴巴数据库分库分表的最佳实践
    Tomcat控制台日志乱码解决方案
    区块链:多链体系在提升性能的同时,怎么去保证单链被攻击性问题
    在 CentOS 7 1801 中安装 PostgreSQL-11
    为什么即使现在生意不太好做,还是有一批批的人开始做生意?
    投资十几万可以做点什么生意?
    理发店真是一个暴利行业吗?
    今日头条是怎么盈利的?
    中国都有哪些著名的风投失败的案例?
    基于语音应用的10项最佳实践
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10401627.html
Copyright © 2011-2022 走看看