BFS求解迷宫的最短路径问题
题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是有解的)(N,M<=100)
输入:
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
输出:
22
本题目与解题思路均来源于挑战程序设计竞赛(第二版),是个经典的将BFS与队列(先进先出)特性紧密结合问题。广度优先搜索(BFS)按照距开始状态由近及远的顺序进行搜索,因此很容易地用来求最短路径、最少操作之类的问题。我们可以用所在的位置表状态,转移的方式为四方向移动,只要将已经访问过的状态用标记管理起来,就可以很好地做到由近及远的搜索。由于要求最短距离,不妨用dis[n][m]数组把最短距离保存起来,初始用非常大的常熟inf来初始化它,这样尚未到达的的位置就是inf,也就同时起了标记的作用。虽然到达终点时就会停止搜索,可如果继续下去直到队列为空的话,就可以计算出到各个位置的最短距离。此外,若搜索到最后,dis依然为inf,便可得知这个位置是无法从起点到达。
附上代码:
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef pair<int,int> pa;
const int inf=0x3f3f3f3f;
char map[][]; //表示迷宫的字符串数组
int n,m;
int sx,sy; //起点坐标
int gx,gy; //终点坐标
int dis[][]; //保存起点到各点最短距离
queue<pa> q;
const int dir[][]={{,},{-,},{,},{,-}}; //表示x和y可以移动的四个方向
int bfs()
{
for(int i=;i<n;i++){
for(int j=;j<m;j++){
dis[i][j]=inf; //将起点到各点的距离初始化为无穷大,表示为到达
}
}
q.push(pa(sx,sy));
dis[sx][sy]=; //从起点出发将距离设为0 ,并放入队列
//不断循环直到队列的长度为0
while(q.size())
{
//取出队首元素
pa p=q.front();
q.pop();
//如果取出的状态是终点,则结束搜索
if(p.first==gx&&p.second==gy) break;
//四个方向的循环
for(int i=;i<;i++)
{
//移动之后的坐标记为(dx,dy)
int dx=p.first+dir[i][];
int dy=p.second+dir[i][];
//判断是否已经访问过,如果dis[dx][dy]不为inf即为已经访问过
if(dx>=&&dx<n&&dy>=&&dy<m&&map[dx][dy]!='#'&&dis[dx][dy]==inf)
{
//可以移动的话,则加入到队列,并且该位置的距离确定为到p的距离加1
q.push(pa(dx,dy));
dis[dx][dy]=dis[p.first][p.second]+;
}
}
}
return dis[gx][gy];
}
int main()
{
cin>>n>>m;
getchar();
for(int i=;i<n;i++){
for(int j=;j<m;j++){
scanf("%c",&map[i][j]);
if (map[i][j] == 'S')
{
sx=i; sy=j;
}
if (map[i][j] == 'G')
{
gx=i; gy=j;
}
}
getchar();
}
int ans=bfs();
cout<<ans<<endl;
return ;
}
/*
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
22
*/
BFS求解迷宫的最短路径问题的更多相关文章
- 广度优先搜索(BFS)——迷宫的最短路径
宽度优先搜索按照距开始状态由近到远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. 宽度优先搜索介绍(一篇不错的文章). 题目描述: 给定一个大小为N*M的迷宫.迷宫有通道和墙 ...
- 编程算法 - 迷宫的最短路径 代码(C++)
迷宫的最短路径 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个大小为N*M的迷宫. 迷宫由通道和墙壁组成, 每一步能够向邻接的上下 ...
- 数据结构实习 Problem H 迷宫的最短路径
数据结构实习 Problem H 迷宫的最短路径 题目描述 设计一个算法找一条从迷宫入口到出口的最短路径. 输入 迷宫的行和列m n 迷宫的布局 输出 最短路径 样例输入 6 8 0 1 1 1 0 ...
- Bellman-Ford & SPFA 算法——求解单源点最短路径问题
Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题.Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好 ...
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...
- Dijkstra求解单源最短路径
Dijkstra(迪杰斯特拉)单源最短路径算法 Dijkstra思想 Dijkstra是一种求单源最短路径的算法. Dijkstra仅仅适用于非负权图,但是时间复杂度十分优秀. Dijkstra算法主 ...
- BFS实现迷宫问题
BFS实现迷宫问题 问题描述,要求从起点走到终点,找出最短的距离,要避开障碍 输入描述,输入一个二维数组表示地图,其中等于10就是终点,等于-10就是起点,等于1就是障碍,等于0就是可以走的 代码: ...
- hdu1728逃离迷宫 (利用最短路径思想+优先队列(BFS))
Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...
- 迷宫的最短路径 (BFS)
N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. (可以构造成pair或者编码成int来表达状态) ...
随机推荐
- MVC 使用cshtml的一些基础知识-和相关整理
首先在认识cshtml之前,先要了解一下Razor视图引擎 如果对此有疑问的话可以借鉴 博客园博文:http://kb.cnblogs.com/page/96883/ 或 博客博文:http://ww ...
- NFS共享文件系统部署
1. 概述 本篇博客主要是介绍如何安装和使用NFS服务. 2. 安装软件包 首先确认系统是否已经安装相应的软件包,执行命:rpm -qa | egrep "rpcbind|nfs-utils ...
- Maven 项目生成或者update jdk变为1.5的问题
在使用Maven构建项目时,生成的maven项目jdk默认使用的是jdk1.5. 在手动修改了jdk之后,update project之后jdk又会变为1.5. 或者用eclipse的Maven插件生 ...
- Shell学习笔记二
一.调试脚本 调试功能是每一种编程语言都应该实现的重要特性之一,当出现一些始料未及的情况时,用它来生成脚本运行信息.调试信息可以帮你弄清楚是什么原因使得程序发生崩溃或行为异常.每位系统程序员都应该了解 ...
- Centos6.5网络配置
由于项目部署的需要,不得不继续研究Linux,前期看过一些Linux方面的资料,也动手配置过Linux网络配置,但是由于开发项目一般在windows下进行的,用Linux比较少,所以基本上也就忘记以前 ...
- Oracle 转移符问题
注:select '''' from dual; --输出一个单引号 select '''''' from dual; --输出两个单引号 select '''''''' ...
- Tomcat启动失败
前景:使用的是tomcat9.0,配置好后,使用一切正常,刷慕课跟着做练习,也一切正常.出事在于,老师为了方便直接拷之前写的一个项目,我照做了,老师改了虚拟路径了,我忘记改了,然后跑了一下项目就出毛病 ...
- 开发中CollectionUtils处理集合
1.org.apache.commons.collections.CollectionUtils; 使用这个工具类,帮我们处理一些集合的操作,非常方便 //取并集public void testUni ...
- Why yarn
http://www.cnblogs.com/LeftNotEasy/archive/2012/02/18/why-yarn.html https://www.ibm.com/developerwor ...
- C#中byte[] 与string相互转化问题
using System; using System.IO; using System.Security.Cryptography; namespace ShareX.UploadersLib.Oth ...