BFS——最小步数 续

上一次用的DFS,这次BFS,直接在地图上扩展结点,如下图所示:


橙黄色代表起点,浅蓝色终点。

#include <cstdio>
#include <queue>

using namespace std;

#define ACCESS      0

struct position
{
	int x, y;
}start, end;

const int direction[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};

queue<position> toExpandPosition;

void BFSExploreMaze(int &minStep)
{
	int i;
	int mazeMap[9][9] =
	{
		1,1,1,1,1,1,1,1,1,
		1,0,0,1,0,0,1,0,1,
		1,0,0,1,1,0,0,0,1,
		1,0,1,0,1,1,0,1,1,
		1,0,0,0,0,1,0,0,1,
		1,1,0,1,0,1,0,0,1,
		1,1,0,1,0,1,0,0,1,
		1,1,0,1,0,0,0,0,1,
		1,1,1,1,1,1,1,1,1
	};
	position currentPos, adjacentPos;
	while (!toExpandPosition.empty())
	{
		toExpandPosition.pop();
	}
	toExpandPosition.push(start);

	while (!toExpandPosition.empty())
	{
		currentPos = toExpandPosition.front();
		toExpandPosition.pop();
		if (currentPos.x == end.x && currentPos.y == end.y)
		{
			minStep = mazeMap[currentPos.x][currentPos.y];
			return;
		}
		for (i = 0; i < 4; i++)
		{
			adjacentPos.x = currentPos.x + direction[i][0];
			adjacentPos.y = currentPos.y + direction[i][1];
			if (mazeMap[adjacentPos.x][adjacentPos.y] == ACCESS)
			{
				mazeMap[adjacentPos.x][adjacentPos.y] =
					mazeMap[currentPos.x][currentPos.y] + 1;
				toExpandPosition.push(adjacentPos);
			}
		}
	}
}

int main()
{
	int testNum, minStep;
	scanf("%d", &testNum);
	while (testNum-- != 0)
	{
		scanf("%d%d%d%d", &start.x, &start.y, &end.x, &end.y);
		BFSExploreMaze(minStep);
		printf("%d\n", minStep);
	}
	return 0;
}


### BFS算法与最小生成树的关系 BFS(广度优先搜索)是一种用于遍历或搜索图的算法,它按照层次结构逐步扩展节点。而最小生成树(MST, Minimum Spanning Tree)是指在一个加权无向图中找到一棵子树,使得该子树包含原图中的所有顶点,并且这些边的权重之和是最小的。 #### 使用BFS构建最小生成树的方法 当涉及到特定场景下的最小生成树问题时,可以利用BFS来辅助计算某些特殊条件下的最短路径矩阵,从而为后应用Prim算法或其他最小生成树算法提供基础数据支持[^2]。具体来说,在一些题目中可能需要先通过BFS预处理得到各个重要节点之间的距离信息,然后再基于此建立完整的带权图模型以便进一步求解最小生成树。 例如,在给定地图上存在多个标记为'A'或者'S'的关键位置的情况下,可以通过执行多次从不同起点出发的BFS操作获取任意两个此类关键地点间的实际通行代价(即所谓的最短路径长度),之后再把这些结果作为输入参数传递到标准形式下的Prim算法当中去完成整个过程——既保证了每一对关联节点间都具备有效连接关系又满足总体开销达到最低限度的要求。 然而需要注意的是,BFS本身并不直接适用于解决一般意义上的最小生成树问题因为它主要关注单源最短路径而非整体网络优化目标;只有在特定条件下配合其他技术手段才有可能发挥间接作用于寻找最佳拓扑结构方面贡献价值. ```python from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) distance = {start: 0} while queue: vertex = queue.popleft() for neighbor in graph[vertex]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) distance[neighbor] = distance[vertex] + 1 return distance ``` 上述代码展示了如何使用Python实现基本版本的BFS函数。这个简单的例子可以帮助理解如何从某个起始点探索未访问过的相邻区域并记录下相应的层数/步数信息直到无法继为止[^3]。 尽管如此,单独依靠BFS并不能独立达成构建最小生成树的任务,因为它的核心功能仅限于发现可达性和测量固定模式内的相对位移量级而已。真正要实现这一目的还需要引入像Kruskal或是改进型后的Prim这样的专门设计用来应对复杂情况的技术框架才行[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值