迷宫最短路径

1226: 迷宫最短路径

时间限制: 1 Sec  内存限制: 128 MB

提交: 1  解决: 1

[提交][状态][讨论版]     
[Edit]      [TestData]

题目描述

给定一个大小为N*M的迷宫。迷宫有通道和墙壁组成,每一步可以向上下左右是个方向移动。求起点到终点的最短路

M,N<=100.

输入

创建迷宫。

输出

输出最短路长度。

样例输入

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

样例输出

22
 
 
#include <cstdio>
#include <iostream>
#include <utility>
#include <queue>
#include <cstring>
#define maxn 505
using namespace std;
const int INF = 10000000;
typedef pair<int,int> PA; 

//输入
char maze[maxn][maxn+1];	//迷宫字符串
int n,m;				//行列
int sx,sy;				//起点
int gx,gy; 				//终点 

int d[maxn][maxn];		//到各个位置的最短距离数组

//4个方向移动的向量
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};

//求从{sx,sy}到{gx,gy}的最短距离
//如果无法到达,则是INF
int bfs(){
	queue<PA> que;
	//memset(d,INF,sizeof(d));			//位置初始化为INF
	//不能用memset
	for (int i = 0; i < n; i++)
		for (int j = 0; j <m; j++) d[i][j] = INF;

		//将起点加入队列 ,并将这一地点的距离设置为0
		que.push(PA(sx,sy));
		d[sx][sy]=0;

		//不断循环直到队列的长度为0
		while(que.size()){
			PA p=que.front();
			que.pop();
			//如果取出的状态已经是终点,则结束搜索
			if(p.first==gx&&p.second==gy) break; 

			//四个方向循环
			for(int i=0;i<4;i++){
				//移动之后的位置为(nx,ny)
				int nx=p.first+dx[i];
				int ny=p.second+dy[i];		

				//判断是否可以移动以及是否已经访问过(d=INF访问过)
				if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
					//可以移动的话加入到队列,并且到该位置的距离确定为到p的距离+1
					que.push(PA(nx,ny));
					d[nx][ny]=d[p.first][p.second]+1;
				}
			}
		}
		return d[gx][gy];
} 

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;
				}
				else if(maze[i][j]=='G'){
					gx=i;gy=j;
				}
			}

			printf("%d\n",bfs());
	}
	return 0;
}

 
时间: 2024-10-17 11:16:38

迷宫最短路径的相关文章

迷宫最短路径 问题

/* 迷宫最短路径 问题 */ #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

迷宫最短路径问题

问题:给定一个大小为N×M的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.请注意,本题假定从起点一定可以移动到终点. 限制条件:N, M ≦100 示例输入: 10 10#S######.#......#..#.#.##.##.#.#........##.##.####....#....#.#######.#....#......####.###.....#...G# 示例输出: 22 思路: BFS广度优先搜索 DFS利用系统栈,不用自

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的基础上进行