宽度优先搜索算法

宽度优先搜索算法

算法简介

宽度优先搜索又称广度优先搜索或横向优先搜索。该算法是一种图形搜索算法,该算法是从起点开始搜索然后一层一层的向下搜索,如果找到目标或者搜索完了全部的节点则算法结束。

实战练习

迷宫寻路问题的求解可以用到该算法来解决。解决该问题时需要处理好两个核心的部分。第一个部分为寻找下一层(新的可行位置),第二个部分为记入新的可行位置。由于寻找过程是一层一层的向下寻找,即探索完一个节点后需要记入新的可行位置和到达这一位置的上一个节点,并且把该位置出列然后开始下一个结点的寻找,在这里就用队列存储数据(先进先出)。由于每一次寻找到的可行位置都记录了到达这一点的上一个位置,此时就可以利用算法最后搜索到的终点一层一层的倒序输出(因为每一个寻找到的位置都记录了上一个位置)输出得到的结果就是可行路径。为了防止寻找到的位置是已经寻找过的位置,就把已经走过的位置标记一下,在这里我把它标记为-1。
源码图片如下:
宽度优先搜索算法
源码如下:

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct {
	int x;
	int y;
	int last;//记录上一个标号
}decation;
typedef struct {
	decation* point;
	int length;
	int list_size;
}LIST;
int lybyrince[10][10] = { 1,1,1,1,1,1,1,1,1,1,
						  1,0,0,0,0,0,0,0,0,1,
						  1,0,1,1,1,1,1,1,0,1,
						  1,1,0,1,1,1,1,1,0,1,
						  1,0,1,0,1,1,1,1,0,1,
						  1,1,1,1,0,1,1,1,0,1,
						  1,1,1,0,1,1,1,1,1,1,
						  1,1,1,1,0,1,1,1,0,1,
						  1,1,1,1,1,0,0,0,0,1,
						  1,1,1,1,1,1,1,1,1,1 };
int xx[9] = { 0,1,1,0,-1,-1,-1,0,1 };//不同方向下的x的偏移值
int yy[9] = { 0,0,-1,-1,-1,0,1,1,1 };//不同方向下的y的偏移值
int search_direct(int a, LIST& b, int c, int d);
void show(LIST a);
int main()
{
	int biaozhi;
	int n = 1;
	int last_x = 8; int last_y = 8;
	decation* p;
	LIST list;
	list.point = (decation*)malloc(100 * sizeof(decation));
	list.length = 2; list.list_size = 100;
	p = list.point;
	p[0].last = 0;
	p[1].x = 1; p[1].y = 1; p[1].last = 0;//记入开始位置
	lybyrince[1][1] = -1;//把走过的位置记为-1,防止寻找到的位置是走过的
	while (1)
	{
		biaozhi = search_direct(n, list, last_x, last_y);
		if (biaozhi) break;//知道寻找到终点结束循环
		n = n + 1;//一层一层向外寻找可以通过的路径
	}
	show(list);
}
int search_direct(int a, LIST& b, int c, int d)
{
	decation* pp = b.point;
	int i = b.length-1;
	for (int n = 1; n <= 8; n++)//一共八个方向
	{
		if (lybyrince[pp[a].x + xx[n]][pp[a].y + yy[n]] == 0)//寻找没有走过的并且没有障碍的位置
		{
			pp[i + 1].x = pp[a].x + xx[n]; pp[i + 1].y = pp[a].y + yy[n];//计入新找到的可行位置的坐标
			pp[i + 1].last = a;//记入这一步的位置是由哪一步到来的
			i = i + 1;
			lybyrince[pp[i].x][pp[i].y] = -1;//此时新到达的位置已经走过了,把他标记为-1;
			b.length = b.length + 1;//线性表长度加一
			if (pp[i].x == c && pp[i].y == d)
				break;//如果找到的位置是终点则结束循环
		}
	}
	if (pp[i].x == c && pp[i].y == d) return 1;//如果找到的位置是终点返回一来退出主函数里的循环
	else return 0;
}
void show(LIST a)//输出经过的路径
{
	int n;
	n = a.length - 1;
	while (n != 0)
	{
		cout << a.point[n].x << " " << a.point[n].y << endl;
		n = a.point[n].last;
	}
}

猜你喜欢

转载自blog.csdn.net/ownplace/article/details/109036029