专题·广度优先搜索(BFS)【including 队列,迷宫问题

初见安~前面发了些题了,来讲讲搜索吧。

一.广度优先搜索(BFS)

1.队列
(1)定义

队列(queue)这一数据结构,也正如我们平时所说的排队:先进先出(First In First Out),与栈(stuck)的先进后出(First In Last Out)正好相反。

(2)队列的一些操作语句

#include//头文件 (如果用万能头就无所谓了)
queue<___> q;//定义,<>内写队列中的变量类型,如int,string…… 
q.push(___);//放元素入队列 
q.pop();//弹出队首元素 
q.empty();//判断是否为空 
q.size();//返回队列元素个数 
q.front();//返回队首元素,但并不改动队列 

2.广搜
(1)定义
广搜,又名宽搜,有在表面搜索的意思。其搜索方式也如其名,辐射状向外扩散地搜索,所以广搜一般都用于在矩阵中找连通块、走迷宫等,因为它最先搜到的时候的步数or时间一定是最短的。

(2)套路 语句
先引入一个例题吧——迷宫游戏。
‘#’为障碍,’ . '为路。只可上下左右四个方向行走。
专题·广度优先搜索(BFS)【including 队列,迷宫问题_第1张图片
求从S到T的最短路。
我们先模拟一下BFS吧:
专题·广度优先搜索(BFS)【including 队列,迷宫问题_第2张图片
【电脑绘图,丑勿喷】
第一步可以到达:(红色部分)
第二步可以到达:(橙色部分)
第三步可以到达:(黄色部分)
第四步可以到达:(淡绿色部分)
第五步可以到达:(深绿色部分)
第六步可以到达:(淡蓝色部分)
第七步可以到达:(深蓝色部分)
第八步可以到达:(蓝紫色部分)
第九步可以到达:(淡紫色部分)
第十步可以到达:(深紫色部分)
第十一步可以到达:(粉色部分)
第十二步:到达T。
专题·广度优先搜索(BFS)【including 队列,迷宫问题_第3张图片

所以最短路长为12。
我们用BFS来实现吧:
首先定个框架。

#include
using namespace std;
int m,n;//迷宫大小
int x,y;//起点坐标
char maze[100][100];//存迷宫
bool vis[100][100];//记录是否走过此路径
int dir[4][2]={{1, 0}, {0,1}, {1, 0}, {0, 1}};//四个方向
int bfs()
{

}
int main() 
{
	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')
			{
				x=i,y=j;
			}
		}
	}
	cout<<bfs()<<endl;
	return 0;
}

接下来写bfs操作内容:

int bfs()
{
	queue<node> q;//定义队列
	q.push(node(x,y,0));//放入起点
	vis[0][0]=1;//记录走过
	while(!q.empty())//队列不空,即还没有走完所有可以到达的点
	{
		node now=q.front();//取出队首
		q.pop();
		for(int i=0;i<4;i++)
		{
			int tx=now.x+dir[i][0];
			int ty=now.y+dir[i][1];//向某一方向
			if(in(tx,ty)&&!vis[tx][ty]&&maze[tx][ty]!='#')
			{
				if(maze[tx][ty]=='T') return now.d+1;//到达了,返回上一步的步数+1
				q.push(node(tx,ty,now.d+1));//没有则存入这一个点,下次取出来继续扩散找路
				vis[tx][ty]=1;
			}
		}
	}
	return -1;//没有路径可以到达,返回-1
}

综上——敲一个走迷宫的代码试试看吧~
输入:
7 7
S…
.#####.
…#.

###…
…#.#
#…T

输出:
12

P.S:
敲出代码并模拟一遍后,我们可以发现:广度优先搜索的优先,在于在队列中天然保证了步数少的排在队列前面,所以找到目的地是比较快的。用bfs的时候要注意:一定要记得记录走过的位置,不走重复的路!如果你忘了,输入数据后卡了一会儿都没有输出结果,赶紧关掉程序,如果你有360加速球的话你可以看到内存在被极快地占用,一直不管的话到了98%再关掉就关不掉了,要让电脑卡很久自己反应过来。
下一次发深搜(DFS)。

迎评:)
——End——

你可能感兴趣的:(搜索)