迷宫的最短路路径

#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;

void BFS()
{
    que.push(P(sx, sy));
    dp[sx][sy] = 0;
    while(!que.empty())
    {
        P a = que.front();
        que.pop();
        if(a.first == ex && a.second == ey)
         return ;
        for(int i=0; i<4; i++)
        {
            int x = a.first + go[i][0];
            int y = a.second + go[i][1];
            if(x>=1 && x<=n && y>=1 && y<=m && maze[x][y] != '#' && dp[x][y] == INF)
            {
                que.push(P(x, y));
                dp[x][y] = dp[a.first][a.second] + 1;
            }
        }
    }
}

int main()
{
    while(~scanf("%d%d", &n, &m) && n+m)
    {
        for(int i=1; i<=n; i++)
        for(int j=1; 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;
            }
            dp[i][j] = INF;
        }
    BFS();
    cout<<dp[ex][ey]<<endl;
    }
    return 0;
}

/*
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
*/

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

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

Tyvj p1371 蛇灵迷宫 (博弈 输出路径)

蛇灵迷宫 描述 Description 李元芳和闪灵在打斗中不慎掉入了蛇灵总坛地下的迷宫,十分恐惧~~~ 迷宫是由n个点组成的,他们停留在1号点,规定他们两个人在一起,每个人轮流决定下一步怎么走,并且只能从序号小的点走向序号大的点,最后无法决定接下来怎么走(走到死路)的人会被处死,另一个人得以逃生. 在这个危机的时刻,拿到地图的李元芳必须以迅雷不及掩耳盗铃的速度判断出自己能否通过做出正确决策来逃生(既然对方是闪灵嘛!当然他每次做出的决策肯定是最好的),所以李元芳向会OI的你求救~~~请你判断出元

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 ********************

迷宫问题(输出路径)_友好界面_音乐播放_彩色字体

1 /* 2 8 6 3 1 1 1 1 1 1 1 1 4 1 0 0 1 0 0 1 1 5 1 1 0 0 0 0 0 1 6 1 0 0 1 0 1 0 1 7 1 0 0 0 0 0 0 1 8 1 1 1 1 1 1 1 1 9 */ 10 #include <iostream> //////////-static-libgcc 11 #include <iomanip> 12 #include <ctime> 13 #include <stack&g

学霸的迷宫(BFS+记录路径)

1 //求从(sx.sy)到(gx.gy)的最短距离; 2 3 #include<iostream> 4 #include<cstdio> 5 #include<cstdio> 6 #include<queue> 7 #include<cstring> 8 #define INF 99999999 9 10 using namespace std; 11 12 typedef pair<int, int > P; //数对,记录位置

POJ-3894 迷宫问题 (BFS+路径还原)

定义一个二维数组: 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

ZOJ3088 Easter Holidays spfa 最长路 最短路 路径打印

题目链接: 3088 题意:一个滑雪胜地包含了n 个地点,m 个滑雪斜坡,k 架雪橇,其中2≤n≤1000.1≤m≤1000.1≤k≤1000.滑雪斜坡和雪橇总是从一个地点到另一个地点:滑雪斜坡是从高地点到低地点,而雪橇刚好相反(注意,雪橇不能下降).Per 是一个滑雪初学者,他很害怕雪橇,尽管他想滑得尽可能快.现在,他发现他可以选择不同的雪橇和滑雪斜坡.他现在想这样安排他的滑雪行程: 1) 从一架雪橇的起点出发并最终回到起点. 2) 这个过程分为两个阶段:第一阶段,乘坐一架或多架雪橇上升:第二

poj(3984)——迷宫问题(输出路径)

题目的大致意思是:给你一个5*5的迷宫,然后你只能往上,下,左,右四个方向走,然后0代表的是可以走的路,1代表的是墙不可以走.然后让我们求出从左上角到右下角的最短路线及其长度. 求长度是好做的,但是输出路径这个我还是第一次碰到. 这里我们使用的队列不可以是STL中的queue了,要用数组来写,因为我们在这里需要头尾两个指针. 然后我们这里还要用到一个保存前驱节点的数组pre,这样在我们输出路径的时候就可以回溯上去. #include<stdio.h> #include<string.h&

SDUT 1269-走迷宫(DFS打印路径)

走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号).现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向.如果一条路都不可行,则输出相应信息(用-1表示无路). 输入 第一行是两个数m

迷宫问题——最短路

一.题目(POJ 3984) 给出一个只有0和1组成的5x5的矩阵表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. 二.解题思路 迷宫问题中的最短路多用BFS,由于要输出最短路,一般可以在更新时保存前驱节点,这里使用DFS从终点寻找距离一次减一的节点,直到到达起点. 三.代码实现 1 #include<stdio.h> 2 #include<iostream> 3 #include<queue>