3分钟搞懂广度优先搜索[BFS]

广度优先搜索

实现方式

  • 队列

问题

在这里插入图片描述

在这里插入图片描述



求从左上角到右下角的最短路径

核心代码

q.push((node){0, 0, 1});				//预处理放入开始结点
	while (!q.empty()) {					//只要还有需要处理的结点
		node cur = q.front();				//去除队首元素
		q.pop();							//出队
		vis[cur.x][cur.y] = true;			//表示已经走过了

		if (cur.x == 4 && cur.y == 4) {
			 cout << cur.l << endl;
			 break;							//第一个到终点后停止循环
		}
		node nt;							//下一个结点
		nt.l = cur.l + 1;
		for (int i = 0; i < 4; i++) {		//判断四个方向
			nt.x = cur.x + nx[i];
			nt.y = cur.y + ny[i];
			if (nt.x < 0 || nt.y < 0 || nt.x > 4 || nt.y > 4) {
				continue;					//出界了继续判断下一个方向
			}
			if (vis[nt.x][nt.y] == false && map[nt.x][nt.y] == 0) {
				q.push(nt);
			}
		}
	}

思路:

  • 先放入头结点
  • 只要有需要搜索的结点就进行循环(即队列不为空)
  • 和深度优先搜素一样进行判断
  • 区别是:每次的结点会放入队列中
  • 如果走到重点,break停止循环

代码

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

struct node {
	int x, y;	//记录状态
	int l;		//记录第几次发散
};

//预处理放入地图
vector<vector<int>> map = {
	{0, 1, 1, 1, 1},
	{0, 0, 0, 0, 0},
	{0, 1, 1, 1, 0},
	{0, 1, 0, 0, 0},
	{0, 0, 0, 1, 0}
};

vector<vector<bool>> vis = {
	{false,false,false,false,false},
	{false,false,false,false,false},
	{false,false,false,false,false},
	{false,false,false,false,false},
	{false,false,false,false,false}
};

queue<node> q;

int nx[4] = {0, 0, 1, -1};
int ny[4] = {1, -1, 0, 0};

int main() {
	q.push((node){0, 0, 1});				//预处理放入开始结点
	while (!q.empty()) {					//只要还有需要处理的结点
		node cur = q.front();				//去除队首元素
		q.pop();							//出队
		vis[cur.x][cur.y] = true;			//表示已经走过了

		if (cur.x == 4 && cur.y == 4) {
			 cout << cur.l << endl;
			 break;							//第一个到终点后停止循环
		}
		node nt;							//下一个结点
		nt.l = cur.l + 1;
		for (int i = 0; i < 4; i++) {		//判断四个方向
			nt.x = cur.x + nx[i];
			nt.y = cur.y + ny[i];
			if (nt.x < 0 || nt.y < 0 || nt.x > 4 || nt.y > 4) {
				continue;					//出界了继续判断下一个方向
			}
			if (vis[nt.x][nt.y] == false && map[nt.x][nt.y] == 0) {
				q.push(nt);
			}
		}
	}
}
posted @ 2024-03-19 23:09  IoOozZzz  阅读(24)  评论(0)    收藏  举报  来源