迷宫最短路径问题

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

限制条件:N, M ≦100

示例输入:

10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

示例输出:

22

思路:

BFS广度优先搜索

DFS利用系统栈,不用自己维护栈

BFS要自己维护一个队列

#include <stdio.h>
#include <iostream>
#include <queue>

using namespace std;
int m;
int n;
const int INF = 0x3f3f3f3f;
char maze[100][100];
int d[100][100];
int sx, sy;
int gx, gy;
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
typedef pair<int, int> P;

void bfs() {
    queue<P> q;
    q.push(P(sx, sy));
    d[sx][sy] = 0;

    while (q.size()) {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        if (x == gx && y == gy) {
            break;
        }
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] != ‘#‘ && d[nx][ny] == INF) {
                q.push(P(nx, ny));
                d[nx][ny] = d[x][y] + 1;
            }
        }

    }

}

int main() {
    cin >> m >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> maze[i][j];
            d[i][j] = INF;
            if (maze[i][j] == ‘S‘) {
                sx = i;
                sy = j;
            }
            if (maze[i][j] == ‘G‘) {
                gx = i;
                gy = j;
            }
        }
    }
    bfs();
    cout << d[gx][gy];
    return 0;
}
时间: 2024-08-24 21:10:32

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

迷宫最短路径

1226: 迷宫最短路径 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 [提交][状态][讨论版]      [Edit]      [TestData] 题目描述 给定一个大小为N*M的迷宫.迷宫有通道和墙壁组成,每一步可以向上下左右是个方向移动.求起点到终点的最短路 M,N<=100. 输入 创建迷宫. 输出 输出最短路长度. 样例输入 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### .

迷宫最短路径 问题

/* 迷宫最短路径 问题 */ #include<iostream> #include<queue> #include<cstring> using namespace std; struct Node{ int x, y; Node(int x,int y) { this->x = x; this->y = y; } }; const int N = 15; int map[9][9]= {1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,

BFS求解迷宫最短路径

本文使用BFS广度优先搜索算法实现求解迷宫的最短路径(C++),使用到了队列先进先出的性质,依次搜索路径直到找到目标出口(如果迷宫能走通)求解到的路径即为该迷宫的最短路径,找到返回true,找不到返回false,本文使用vexmap一个map容器记录队列的搜索路径(记录队列路径的实现有点草率,可以再优化).</p><p> </p><pre class="cpp" name="code">#include<iost

回溯法找迷宫最短路径

有一个二维数组,0表示路,-1表示墙,求其中任意两点的最短路径 我们先看,怎么求一条路径:求两点路径是一个数据结构上的典型的迷宫问题,解决办法如下: 从一点开始出发,向四个方向查找(上,右,下,左),每走一步,把走过的点的值+1,防止重复行走,并把走过的点压入堆栈(表示路径),如果遇到墙.或者已走过的点则不能前进,如果前方已经无路可走,则返回,路径退栈,这样递归调用,直到找到终点为止. 如果我们调整查找的顺序,改为左.右.上.下,可能会得到更短的路径,但这种方法不能保证一定是最短路径. 经过网上

Sicily Maze(BFS计算迷宫最短路径)

      1000. Maze                       Time Limit: 1sec    Memory Limit:256MB Description Master Tang is kidnapped by a monster and put in a maze, and Mr. Sha wants to rescue him. The maze is an n*m matrix. There are two types rooms in the maze, 1 fo

迷宫最短路径-货郎担问题的解决思路

要解决的问题: 给定一个迷宫,此迷宫中有且仅有一个入口和出口,其中设有若干检查点,要求从入口开始,经过所有检查点后到达出口所需的最短路径.其中路径中允许多次经过入口或出口或某检查点,但路径的开始和结尾必须分别是入口和出口.更形象一点就是要把图中所有的宝藏找出来带出去的问题.    连设计算法+写算法实现的论文+编写代码和制作演示动画,花费了四天时间,还是小有收获的赶脚.算法的核心描述就是先假设已经有一个最优路径,然后插入一个新的检查点时,如何使插入导致的路径增量最小.这种先假设存在最优路径然后再

【贪心算法】迷宫最短路径

Description 为了测试某种药物对小白鼠方向感的影响,生物学家在实验室做了一个矩形迷宫,入口和出口都确定为唯一的,且分布在矩形的不同边上.现在让你算出小白鼠最短需要走多少步,才可以从入口走到出口. Input 共N+1行,第一行为N(N=0表示输入结束),以下N行N列0-1矩阵,1表示不能通过,0表示可以通过(左上角和右下角为0,即入口和出口),其中N<30. Output 只有一个数,为最少要走的格子数.0表示没有路径. Sample Input 5 0 1 1 1 1 0 0 1 1

cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】

http://acm.uestc.edu.cn/#/problem/show/1088 王之迷宫 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 王被困在了一个3维的迷宫中,他很想逃离这个迷宫回去当学霸,你能帮助他么? 由于王很仁慈,他悄悄地告诉你,本题读入迷宫的每一行时,要用scanf("%s"...) ...... Input 多组测试

【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因为广搜需要的就是队列,所以相比递归队列更耗内存? 当然DFS并不像上图所说,需要用栈,而是运用递归即可. BFS: 因为BFS是要一个接一个的遍历,所以用到了结构体,来保存坐标和当前所走步数 1.每走一步,通过定义的结构体,从队列中提取a(即上一步的坐标.步数(步数每次累加)) 2.在a的基础上进行