迷宫问题——最短路

一、题目(POJ 3984)

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

二、解题思路

迷宫问题中的最短路多用BFS,由于要输出最短路,一般可以在更新时保存前驱节点,这里使用DFS从终点寻找距离一次减一的节点,直到到达起点。

三、代码实现

  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<queue>
  4 #include<stack>
  5 #include<stdbool.h>
  6 using namespace std;
  7
  8 typedef pair<int, int> P;
  9 const int INF = 1000000;
 10 const int max_n = 100 + 10;
 11 const int max_m = 100 + 10;
 12 int n, m;
 13 int sx, sy, ex, ey;
 14 int dis[max_n][max_m];
 15 int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 };
 16 int maze[max_n][max_m + 1];
 17 bool vis[max_n][max_m + 1];
 18 stack<P>s;
 19
 20 int bfs()
 21 {
 22     queue<P>que;
 23     for (int i = 0; i < n; i++)
 24         for (int j = 0; j < m; j++)
 25             dis[i][j] = INF;
 26     dis[sx][sy] = 0;
 27     que.push(make_pair(sx, sy));
 28     while (!que.empty())
 29     {
 30         P p = que.front();
 31         que.pop();
 32         int xx = p.first; int yy = p.second;
 33         if (xx == ex && yy == ey)  break;
 34
 35         for (int i = 0; i < 4; i++)
 36         {
 37             int nx = xx + dx[i]; int ny = yy + dy[i];
 38             if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0 && dis[nx][ny] == INF)
 39             {
 40                 que.push(make_pair(nx, ny));
 41                 dis[nx][ny] = dis[xx][yy] + 1;
 42             }
 43         }
 44     }
 45     return dis[ex][ey];
 46 }
 47
 48 void dfs(int x,int y)
 49 {
 50
 51     if (x == ex && y == ey)
 52         s.push(make_pair(x, y));
 53
 54     if (x == sx && y == sy)
 55     {
 56         while (!s.empty())
 57         {
 58             P tmp = s.top();
 59             s.pop();
 60             printf("(%d, %d)\n", tmp.first, tmp.second);
 61         }
 62         return;
 63     }
 64     else
 65     {
 66         P tmp2 = s.top();
 67         //s.pop();
 68         int xx = tmp2.first; int yy = tmp2.second;
 69         for (int i = 0; i < 4; i++)
 70         {
 71             int nx = xx + dx[i]; int ny = yy + dy[i];
 72             if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0)
 73                 if (dis[nx][ny] == dis[xx][yy] - 1)
 74                 {
 75                     vis[nx][ny] = true;
 76                     s.push(make_pair(nx, ny));
 77                     dfs(nx, ny);
 78
 79                     vis[nx][ny] = false;
 80                     if(!s.empty())  s.pop();
 81                 }
 82         }
 83     }
 84     return;
 85 }
 86 void slove()
 87 {
 88     int res = bfs();
 89     dfs(ex,ey);
 90 }
 91
 92 int main()
 93 {
 94     n = 5; m = 5;
 95     for (int i = 0; i < n; i++)
 96         for (int j = 0; j < m; j++)
 97             cin >> maze[i][j];
 98
 99     sx = 0; sy = 0;
100     ex = 4; ey = 4;
101     slove();
102     return 0;
103 }

原文地址:https://www.cnblogs.com/lfri/p/9655815.html

时间: 2024-10-16 15:42:24

迷宫问题——最短路的相关文章

【bzoj 3299】 [USACO2011 Open]Corn Maze玉米迷宫(最短路)

就一个最短路,并且边长都是1,所以每个点只搜一次. 1 /************************************************************** 2 Problem: 3299 3 User: MT_Chan 4 Language: C++ 5 Result: Accepted 6 Time:72 ms 7 Memory:2420 kb 8 ***********************************************************

迷宫的最短路路径

#include <bits/stdc++.h> using namespace std; #define INF 0x7ffffff #define maxn 105 typedef pair<int, int> P; int dp[maxn][maxn], n, m; char maze[maxn][maxn]; int sx, sy, ex, ey; int go[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; queue<P> que;

Codeforces Gym 100187E E. Two Labyrinths bfs

E. Two Labyrinths Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/E Description A labyrinth is the rectangular grid, each of the cells of which is either free or wall, and it's possible to move only between free

C++ 栈的应用

1.栈的应用1 解决迷宫问题 问题:一个n*n的0.1矩阵,0 表示可以走通,1表示不可以走 ,假定矩阵的下边是出口,给定矩阵的入口坐标,求出走出迷宫的路径 这里用 栈 主要是解决 如图所示 走不出去 会退时上一步(出栈) 位置的记录 以及 记录已经走过的路径(压栈) 扩展 :(1) 非递归法实现 (递归法 与 非递归 的 一点不同 递归法不会出现 尝试下一步失败后 退到上一步 再次尝试下一步时 不会出现 重复 尝试上一次走错的那个"下一步" 而 下面使用 栈的方式的 退栈时 下一步尝

二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园

BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 10.28 9 9 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ##E # ######### 4.67 9 9 ######### # ## ## ### #S# # # # E ## # # ##### # ## ### # ##### # # # # ######### 39.06 9 9 ######### # # # # # # # #

BFS(最短路+路径打印) POJ 3984 迷宫问题

题目传送门 1 /* 2 BFS:额,这题的数据范围太小了.但是重点是最短路的求法和输出路径的写法. 3 dir数组记录是当前点的上一个点是从哪个方向过来的,搜索+,那么回溯- 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-4 9:02:06 8 File Name :POJ_3984.cpp 9 ********************

迷宫游戏(单源最短路)

个人心得:对于复杂抽象的算法还是比较模糊,希望以后有待加强.这题就是用dijskrual算法,在算出最短时间的时候进行适当的更改,还是比较模糊. 1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽

[解题报告]迷宫 状压+最短路 SPFA

深夜补题... [Description]你所在的迷宫可以用 N 行 M 列的矩阵来描述:图标 含义# 墙,无法通过. 地面,可以通过小写字母(a.b.c.....z) 钥匙,可以打开标有对应大写字母的门大写字母(A.B.C.....Z) 门,可以被标有对应小写字母的钥匙打开$ 你的初始位置& 迷宫的出口位置迷宫的四周都有墙,所以你无法走出这片 N*M 的区域,只能从”&”处离开迷宫,你只能向东西南北四个方向走.你的任务是,计算出走出迷宫需要的最少步数是多少?[Input]第 1 行两个正

51nod 1459 迷宫游戏【最短路拓展】

1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一 些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大.现在问题来了,给定房间. 道路.分数.起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么? Inpu