POJ 3984 迷宫问题 广搜迷宫解法

Description

定义一个二维数组:

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 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

本题是经典的迷宫搜索问题了,使用广搜比使用深搜效率要高。

思路关键点:

1 从终点出发查找起点,这样方便记录路径

2 每次查找到下一个空格,可走方格之后,可以马上标识该格为不可走了

3 找到起点之后,马上可以返回

关键是第二点为什么会成立?

因为我们需要找最短路径,只要最先可以达到,那么就肯定是最短路径,不需要从其他方向进入了。

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <queue>
#include <algorithm>
#include <xutility>
using namespace std;

const int N = 5;
int Maze[N][N];
pair<int, int> path[N][N];
const int BLOCK = 1;
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};

inline bool isLegal(int x, int y)
{
	return x>=0 && y>=0 && x<N && y<N && !Maze[x][y];
}

template<typename T>
inline bool equ(T t1, T t2) { return t1 == t2; }

void bfsGetPath(int sx = 0, int sy = 0, int ex = 4, int ey = 4)
{
	queue<pair<int, int> > qu;
	qu.push(make_pair(ex, ey));//初始条件,从终点开始搜索到起点,方便记录路径
	path[ex][ey] = make_pair(-1, -1);//记录终点结束条件值
	Maze[ex][ey] = BLOCK;//标志为不可走

	while (!qu.empty())
	{
		pair<int, int> fa = qu.front();	qu.pop();
		for (int i = 0; i < 4; i++)
		{
			int nx = dx[i] + fa.first, ny = dy[i] + fa.second;
			if (!isLegal(nx, ny)) continue;//跳过不可走的方格

			path[nx][ny] = fa;//记录路径
			if (equ(nx, sx) && equ(ny, sy)) return;//找到起点可以返回

			qu.push(make_pair(nx, ny));//入队列
			Maze[nx][ny] = BLOCK;//入队列的方格,可以马上置为不可走状态
		}
	}
}

int main()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			scanf("%d", Maze[i]+j);
		}
	}

	bfsGetPath();

	int x = 0, y = 0;//起点开始输出路径点
	while (x != -1)
	{
		printf("(%d, %d)\n", x, y);
		int nx = path[x][y].first;
		int ny = path[x][y].second;
		x = nx, y = ny;//注意需要使用中间变量nx, ny
	}
	return 0;
}
时间: 2024-11-08 23:50:49

POJ 3984 迷宫问题 广搜迷宫解法的相关文章

POJ 3126 Prime Path( 广搜 )

Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12974   Accepted: 7342 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-dig

POJ 1915(双向广搜)

应该是双向广搜的简单题,虽然写了很久.双向:简而言之就是从起点(正向搜索)和终点(逆向搜索)同时开始搜索,当两个搜索产生的一个子状态相同时就结束搜索. 通常有两种实现方法: 1.用一个队列来储存子状态,起点和终点先后入队,正向搜索和逆向搜索交替进行,两个方向的搜索交替扩展子状态.直到两个方向的搜索产生相同的子状态结束. 2.两个方向的搜索虽然是交替扩展子状态的.但是两个方向生成的子状态的速度不一定平衡.所以,可以每次选择子状态数较少的那个方向先进行扩展.这样就不会出现两个方向生成子状态的速度的不

广搜 迷宫(zznu 1962)

http://acm.zznu.edu.cn/problem.php?id=1962 题目描述 在很多 RPG (Role-playing Games) 游戏中,迷宫往往是非常复杂的游戏环节.通常来说,我们在走迷宫的时候都需要花非常多的时间来尝试不同的路径.但如果有了算法和计算机的帮助,我们能不能有更快的方式来解决这个问题?我们可以进行一些尝试. 现在我们有一个 N 行 M 列的迷宫.迷宫的每个格子如果是空地则可以站人,如果是障碍则不行.在一个格子上,我们可以一步移动到它相邻的 8 个空地上,但

迷宫问题 广搜加上一些操作

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <queue> using namespace std; int w[10][10],ww[10][10]; int aa[10][10]; int a[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; str

POJ 2251 Dungeon Master (广搜)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18773   Accepted: 7285 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled

Prime Path POJ - 3126(简单广搜)

题目链接:https://cn.vjudge.net/problem/POJ-3126 注意:预处理1000-9999间的素数,并且对入过队列的数进行标记,防止重复入队,否则超时 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 #include <algorithm> 6 #include <cmath> 7 #de

HDU 1026 Ignatius and the Princess I 迷宫广搜剪枝问题

本题是个经典的迷宫广搜问题类型了.网上看到好多解法. 很多解题报告都没什么分析,更不会指出其中的关键点.代码更加像一大抄.有人分析也一大篇分析,不过全部都不切中关键,甚至在分析什么广搜和深搜区别,广搜为什么快之类的,还有喊什么暴搜之类的,全错了.估计这些代码都是抄过的. 通过一大段的时间研究,终于搞通了. 本题虽然可以说是广搜,但是其中的关键却是剪枝法,为什么呢? 因为迷宫并不能简单地广搜就能搜索出所有路径的,甚至只要迷宫大点就不能搜索出是否有路径,如果没有条件剪枝的情况下:不信,你严格写一个广

poj 3984:迷宫问题(广搜,入门题)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description 定义一个二维数组: 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表示可以走的路,只能横着走或竖着走,不能斜着走,要

迷宫广搜

上学期学了C,这学期学C++.感觉最难的还是算法,上周作业的一道广搜题是我第一次接触广搜,由于第一学期刚学编程就接触的太多的算法难题,不禁对代码产生畏惧,不过还好没有放弃,虽然算法很难,但我慢慢找到了一点学数学时的乐趣.先介绍一下这道未来的我看过来会觉得很简单一道题吧 You are provided a maze(迷宫), and you need to program to find the least steps to walk from the start to the end.And