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

    POJ 3984 迷宫问题

    Time Limit: 1000MS    Memory Limit: 65536K

    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)
    

     

    题解

      水题。

      BFS找最短路径,然后再BFS回溯,倒序输出即可。

     

    代码 C++

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 #define INF 0x7F7F7F7F
     5 struct Point{
     6     int x, y;
     7 }now, nxt, opt[105];
     8 int map[15][15], fx[8] = { 1, 0, -1, 0, 0, -1, 0, 1 };
     9 int main(){
    10     int i, j, tmp;
    11     for (i = 1; i <= 5; ++i) for (j = 1; j <= 5; ++j){
    12         scanf("%d", &tmp);
    13         if (!tmp) map[i][j] = INF;
    14     }
    15     std::queue<Point> q;
    16     now.y = now.x = 1;
    17     q.push(now); map[1][1] = 2;
    18     while (!q.empty()){
    19         now = q.front(); q.pop();
    20         tmp = map[now.y][now.x] + 1;
    21         for (i = 0; i < 8; i += 2){
    22             nxt.y = now.y + fx[i]; nxt.x = now.x + fx[i + 1];
    23             if (map[nxt.y][nxt.x] == INF){
    24                 map[nxt.y][nxt.x] = tmp; q.push(nxt);
    25             }
    26         }
    27     }
    28     now.y = now.x = 5;
    29     q.push(opt[0] = now); j = 1;
    30     while (!q.empty()){
    31         now = q.front(); q.pop();
    32         tmp = map[now.y][now.x] - 1;
    33         for (i = 0; i < 8; i += 2){
    34             nxt.y = now.y + fx[i]; nxt.x = now.x + fx[i + 1];
    35             if (map[nxt.y][nxt.x] == tmp){
    36                 opt[j++] = nxt; q.push(nxt); break;
    37             }
    38         }
    39     }
    40     for (i = j - 1; ~i; --i) printf("(%d, %d)
    ", opt[i].y - 1, opt[i].x - 1);
    41     return 0;
    42 }
  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/Simon-X/p/6391505.html
Copyright © 2011-2022 走看看