迷宫的最短路径

迷宫问题(最短路径问题) 我们接着之前讲过的初阶迷宫问题,这次我们来说说高阶迷宫问题,高阶的迷宫问题难在有多条路径去选择,所以我们现在需要做的不是找到路径而是找到最短的路径地下迷宫_牛客题霸_牛客网 (nowcoder.com)小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。 阅读详情

题目:给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。

#include <iostream>
#include<queue>

using namespace std;

const int INF=100000;
int n,m,sx,sy,ex,ey;
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
int step[105][105];
char maze[105][105];
typedef pair<int,int> P;

void solve();
int bfs();

int main()
{
    while(cin>>n>>m){
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>maze[i][j];
                if(maze[i][j]=='S'){
                    sx=i;sy=j;
                }
                if(maze[i][j]=='G'){
                    ex=i;ey=j;
                }
                step[i][j]=INF;
            }
        }
        solve();
    }
    return 0;
}
void solve(){
    int ans=bfs();
    cout<<ans<<endl;
}
int bfs(){
    queue<P> q;
    q.push(P(sx,sy));
    step[sx][sy]=0;
    while(q.size()){
        P p=q.front();
        if(p.first==ex&&p.second==ey) break;
        q.pop();
        for(int i=0;i<4;i++){
            int tx=p.first+dx[i],ty=p.second+dy[i];
            if(tx>=0&&tx<n&&ty>=0&&ty<m&&step[tx][ty]==INF&&maze[tx][ty]!='#'){
                q.push(P(tx,ty));
                step[tx][ty]=step[p.first][p.second]+1;
            }
        }
    }
    return step[ex][ey];
}


迷宫最短路径求解 上节中只是提到了如何找到迷宫的通路,但是很显然有些迷宫不止一条通路,所以怎样才能求得迷宫最短路径呢? 要找到最短路径,那必然需要知道所有的路径,才能找出最短路径。所以最重要的还是利用栈和回溯法,同时和递归结合起来。 思路:首先从入口点开始,查找下一个结点的时候要与当前结点进行比较,因为所有路过的结点都是被标记的,表示的是从入口点到当前点所走的长度,而且都是递增。 所以有可能被比较的对 阅读详情

相关推荐

程序:用栈求解迷宫问题,要求输出所示的迷宫的所有路径,并求第1条最短路径长度及最短路径

用栈求解迷宫问题,输出所示的迷宫的所有路径,并求第1条最短路径长度及最短路径 代码及设计思路如下图: #include<stdio.h> # define M 5 //定义行数 # define N 5 //定义列数 # define MaxSize 100 //栈最多元素个数 int mg[M+2][N+2]=//一个迷宫数组(M+2行,N+2列),四周加上均为1的外边框,0表示可以...

weixin_45908712的博客 2956

给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后达到右下角的位置

/* * 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后达到右下角的位置, * 路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6,1,0就是最小路径和,返回12.1 3 5 98 1 3 45 0 6 18 8 4 0分析: 对于这个题目,假设m是m行n列的矩阵,那么我们用dp[m][n]来抽象这个问题,dp[]i]表示的是从原点...

qq_35556504的博客 1万+

迷宫算法总结(最短路径

算法 迷宫算法总结(最短路径) @author:Jingdai @date:2020.11.20 迷宫问题是一个非常经典的算法问题,现总结一下。 题目描述 给你一个迷宫,并给你一个起点和终点,请你给出从起点到终点的最短路径,若不存在最短路径,输出 -1。迷宫中用 '#' 代表障碍,其余字符都可以走。 输入描述,第一行两个数代表迷宫的大小(行数m和列数n);第二行代表起点和终点的坐标;后面的 m 行是迷宫。 输入示例: 10 10 0 1 9 8 #S######.# ......#..# .#.#

qq_41512783的博客 9359

迷宫问题。

题目描述 设有一个N*N(2<=N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放有0和1,0表示可通,1表示不能,迷宫走的规则如下图所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。 找出一条从入口(左上角)到出口(右上角)的路径(不能重复)。输出路径总数。如果无法到达,输出0。 输入 3 000 011 100 输出 2 代码 #include <bits/stdc++.h>

weixin_53550834的博客 782

计蒜客-走迷宫

一个 n行 m 列的 2 维的迷宫,'S'表示迷宫额起点,'T'表示迷宫的终点,'#'表示不能通过的点,'.' 表示可以通过的点。你需要从'S'出发走到'T',每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。 输入格式 第一行输入 n, m (1≤n,m≤10) 表示迷宫大小。 接下来输入 n行字符串表示迷宫。 输出格式 输入通过迷...

amf12345的博客 784

迷宫最短路径问题

为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),小青蛙在迷宫中水平移动一个单位距离需要消耗1点体力值,向上爬一个单位距离需要消耗3个单位的体力值,向下移动不消耗体力值,当小青蛙的体力值等于0的时候还没有到达出口,小青蛙将无法逃离迷宫。现在需要你帮助小青蛙计算出能否用仅剩的体力值跳出迷宫(即达到(0,m-1)位置)。

qq_62939852的博客 2729

用Java实现迷宫最短路径算法

宽度优先搜索 迷宫最短路径用宽度优先搜索(bfs)相比用深度优先搜索(dfs)的好处在于bfs每次计算都是最短路径不存在重复计算,而dfs每计算出一条可行的路径都要与先前的路径比较,然后储存最短路径。 而bfs的思想是先计算出围绕起点的所有点的距离并储存起来 S是起点,数字为该点到S的距离 根据该思想为下题写一段程序 在N*M的迷宫中,计算出S到G的最短路径#’,’.’, ‘S’, 'G’...

c_yejiajun的博客 1万+

关于迷宫最短路径问题及解决

问题: 迷宫问题:求出从入口到出口的最短路径。 设置一个数组mg表示迷宫,方块为0表示对应方块是通道,为1时表示对应方块为墙: //M=8,N=8 int mg[M+2][N+2]={ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,...

小凡哥哥的博客 2279

[数据结构]求解迷宫最短路径问题

一、问题概述        之前,我们了解了如何实现迷宫问题(对于迷宫只有一个出口可以通的情况),事实上我们的迷宫有多个出口,对于每条路径来说,有长有短,所以在这里,我们讨论一下迷宫最短路径,即迷宫路径的最优解问题。 二、解决方案        对于这样一个迷宫:        注:数字为0的表示可以通过,数字为1的表示不可

xxpresent的博客 1万+

Java实现迷宫最短路径BFS算法

利用广度优先遍历算法的特点,由于迷宫每次只能走一格,所以对于任意一个节点,bfs最先到达时一定时最短路径。 package recursion; import java.util.ArrayDeque; import java.util.Deque; import java.util.Stack; public class Maze { private class Node{ int x...

weixin_44963741的博客 3976

迷宫最短路径c语言程序,c语言,迷宫最短路径

#include #include #include #define MAX 30//迷宫最大30*30#define ENDS -2//端点位置标记为-2#define ROUT -1//入队的路径标记为-1#define SHORTESTPATH 2//将最终的最短路径标记为2//队列结构,保存进行广度优先搜索时的路径typedef struct QueueNode{int a[2];//记录...

weixin_39836860的博客 2097

c++ 队列迷宫最短路径

目录 一.原理 1.设计数据结构 2.设计函数实现 3.主函数 一.原理 1.遍历地图直到终点 2.通过终点反推出最短路径 1.设计数据结构 //下面为顺序栈 struct Box { int i, j; int pre; }; struct QuType { Box data[MaxQueue]; int front, rear; }; //初始化队列 void IninQueue(QuType*& q); //判断队列是否为空 bo

sd1_mc的博客 3018

【java】走迷宫最短路径

输入一个n*m的迷宫,1表示空地,0表示障碍物,输出从某个点到某个点的最短路径 样例输入: 6 5 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 3 样例输出: DDDDRRUUURU import java.util.LinkedList; import java.util.Que

wow_bc的博客 7547

迷宫最短路径问题(ShortestPath)的求解——利用链式队列

迷宫最短路径问题(ShortestPath)的求解——利用链式队列 注:借助于栈求解迷宫问题时,并不能保证找到一条从迷宫入口到迷宫出口的最短路径。而借助于队列,可以找到从迷宫入口到迷宫出口的最短路径(如果有的话)。在迷宫中寻找最短路径问题在其他领域也存在,例如,在解决电路布线问题时,一种很常用的方法是在布线区域叠上一个网格,该网格把布线区域划分成n*m个方格,就像迷宫一样。从一个方格a的中心点连接到另一个方格b的中

Catherine的笔记 1万+

关于栈与递归求解迷宫迷宫最短路径问题

一、栈实现迷宫问题: 问题描述:用一个二维数组模拟迷宫,其中1为墙,0为通路,用栈方法判断迷宫是否有出口,下图为简单模拟的迷宫: 思想: 1.首先给出入口点,如上图入口点坐标为{2,0}; 2.从入口点出发,在其上下左右四个方向试探,若为通路(值为0)时,则向前走,并将每次通路结点入栈(push)保存和标记走过的路为2; 3.当四个方向都没有通路时,则开始回溯,将栈中保存的结点开

L_XRUI的博客 4176

C语言 利用队列求迷宫最短路径

C语言 数据结构利用队列求迷宫最短路径 利用队列,求迷宫最短路径,再用栈输出路径 迷宫障碍为#,@为路径,随机产生的是10*10的迷宫。 话不多说,直接上代码 #include<stdio.h> #include<stdlib.h> #include<time.h> #define STACKSIZE 100 #define STACK_SIZE 50 typedef struct{//单个位置 int x,y,data; int last,flag; //上一步 是

zei_qiang的博客 5892
上一篇: POJ2386 Lake Counting
下一篇: POJ1979 Red and Black
sun_apple_123
博客等级 码龄11年 4粉丝 65原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值