实现BFS之“营救”

广度优先遍历(Breadth First Search,BFS)是一个分层的搜索过程,没有回退过程,是非递归的。


DFS与BFS的小秘密:

1、深度优先搜索算法的思路很简单,比较好理解,但得到的解不是最优的;而广度优先搜索则恰恰相反;

2、如果节点有无穷多个,深度优先搜索算法在某处分支可以无限搜索下去却找不到解,这时我们可以采用有界深度优先搜索~


题目来源:

ZOJ Monthly,October 2003,ZOJ1649

题目描述:

Angel被MOLIGPY抓住了,她被关在监狱里。监狱可以用一个N*M的矩阵来描述,1

试计算Angel的朋友接近Angel至少需要多长时间,只能向上、下、左、右移动,而且墙壁不能通过。

输入描述:

输入文件中包含多个测试数据。每个测试数据的第1行为两个整数N和M,接下来有N行,每行有M个字符:"."代表道路,"a"代表Angel,"r"代表Angel的朋友,"#"代表墙壁,"x"代表警卫。

输出描述:

对每组测试数据,输出一个整数,表示接近Angel所需最少时间。如果无法接近Angel,则输出"Poor ANGEL has to stay in the prison all his life."。

样例输入:

7 8

#.#####.

#a.#xr..

#.x#xx..

..xxxx.#

#.......

.#......

........

样例输出:

12


闲话少叙,奉上代码+注释~

Code:

#include
#include
using namespace std;

#define MAXN 200
#define INF 1000000

struct point
{
	int x, y;				//记录点的坐标
	int step;				//记录到达当前点所用步数
	int time;				//记录到达当前点所用时间
};

queueQ;				//想法:用队列存储BFS遍历的节点,队头为当前所处位置,把所有遍历到新的节点插入队尾

char map[MAXN][MAXN];		//地图
int mintime[MAXN][MAXN];	//到达每个点所用时间
int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };	//四个方向:上右下左
int N, M;					//监狱的大小
int ax, ay;					//Angel所在位置

int BFS(point start)
{
	int i;
	Q.push(start);			//将顶点入队
	point head;				//定义一个当前点
	while(!Q.empty())
	{
		head = Q.front();	//获取队头点,即当前点
		Q.pop();			//获取后随即弹出,为后面的操作做预处理
		for(i = 0; i < 4; i++)
		{
			int x = head.x + dir[i][0], y = head.y + dir[i][1];		//获取下一个方向上的坐标
			if(x>=0 && x=0 && y
运行结果:

实现BFS之“营救”_第1张图片

Ps:如有Bug,欢迎拍砖~

你可能感兴趣的:(狂奔のC/C++,狂奔の数据结构与算法,数据结构与算法随笔,C/C++每日小练)