bfs浅学习

看了一些关于广搜的文章,在广搜的讲解中,遇到最多的就是队列。其中会分析习题,然后写出代码,但是基本上每篇都会有含有利用c++中的学习内容,将数据压入队列中或者将队列中最前面的数据舍弃。bfs的逻辑倒是懂了,但却不知道到底应该怎么使用到bfs,这点是之后要着重学习的地方。

其实今天还是写了一道有关广搜的习题的,但是看题解还是有部分不明白。看到了一个明白一点的题解了呢又不知道这个程序哪里用了广搜。。。

先将题目和代码贴出来吧。刚刚写完代码发现调试结果是错的,今天实在忙不完了。明天打算看看是哪里出了问题,然后再给大家讲解思路和代码吧。同时进一步吧广搜弄的更加明白一些,争取自己在写题目时会用上广搜

题目:

#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);//图的大小
	int map[33][33];
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			scanf("%d", &map[i][i]);
			if (map[i][j] == 0)
			{
				map[i][j] = 2;//先假设将所有等于0的地方涂为2,之后再找出边界外的2改为0
			}
		}
	}
	for (int i = 1; i <= n; i++)//将所有边界的2都可以置为0
	{
		map[1][i] = 0;
		map[n + 1][i] = 0;
		map[i][1] = 0;
		map[1][n + 1] = 0;
	}
	for (int i = 0; i <= n; i++)//将图扩大一圈
	{
		map[0][i] = 9;
		map[i][0] = 9;
		map[n + 1][i] = 9;
		map[i][n + 1] = 9;
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = i; j <= n; j++)
		{
			if (map[i][j] != 1)
			{
				if (map[i - 1][j] == 0 || map[i + 1][j] == 0 || map[i][j + 1] == 0 || map[i][j - 1] == 0)
				{
					map[i][j] = 0;
				}
			}
			
		}
	}
	for (int i = 0; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			printf("%d ", map[i][j]);
		}
		printf("\n");
	}
	return 0;
}

今天比较水

<think>好的,我现在需要帮助用户比较DFS(深度优先搜索)和BFS(广度优先搜索)算法的区别以及它们的应用场景。首先,我应该从基础开始,回想这两个算法的核心原理和实现方式。 DFS和BFS都是图遍历算法,但它们的遍历顺序不同。DFS会尽可能深地探索图的分支,直到到达末端,然后回溯;而BFS则是逐层访问节点,先访问离起点近的节点。这可能导致它们在处理不同问题时效率不同。 接下来,我需要整理它们的区别。首先是访问顺序,DFS使用栈(递归或显式栈),而BFS使用队列。然后是空间复杂度,BFS在最坏情况下空间复杂度较高,尤其是当树比较宽的时候,比如平衡二叉树,BFS需要存储大量节点,而DFS只需要存储当前路径的节点。时间复杂度方面,两者都是$O(V+E)$,其中V是顶点数,E是边数,但实际应用中可能因问题而异。 应用场景方面,用户可能想知道什么时候用DFS更好,什么时候用BFS。比如,最短路径问题通常用BFS,因为一旦找到目标,路径就是最短的。而DFS可能更适用于需要遍历所有可能的情况,比如拓扑排序或连通性问题。需要引用用户提供的引用内容,特别是引用[2]提到DFS在乐观情况下可能更快找到路径,但最坏情况下和BFS一样。 可能还要考虑实现上的差异,比如递归实现的DFS代码简洁,但可能有栈溢出的风险;而BFS通常用队列,迭代实现更直观。此外,内存消耗也是选择算法的重要因素,尤其是在节点数量大的情况下。 然后需要检查是否有遗漏点,比如双向BFS或者迭代加深DFS这样的优化策略,但用户的问题可能更关注基础比较,所以暂时不需要深入这些高级话题。确保回答结构清晰,分点列出区别和应用场景,并举例说明。最后生成相关问题,帮助用户进一步学习。 现在需要确保遵循系统指令,数学公式用$...$,独立公式用$$...$$,正确的中文回答,引用标注在适当的位置。还要生成相关问题,放在最后。同时,参考用户提供的引用内容,特别是引用[1]和引用[2]中的内容,确保回答准确可靠。</think>### DFS vs BFS 算法区别与应用场景 #### 一、核心区别 1. **遍历顺序** - **DFS(深度优先搜索)**:沿着一条路径尽可能深入,直到无法继续时回溯。实现方式通常使用**栈**(递归或显式栈)。 - **BFS(广度优先搜索)**:逐层遍历节点,先访问距离起点最近的节点。实现方式使用**队列**。 2. **空间复杂度** - DFS的空间复杂度为$O(h)$($h$为树/图的最大深度),适用于纵深结构。 - BFS的空间复杂度为$O(w)$($w$为树/图的最大宽度),适用于宽层结构。例如,平衡二叉树中BFS需要存储$O(2^d)$节点($d$为层数)[^1]。 3. **时间复杂度** 两者均为$O(V+E)$($V$为顶点数,$E$为边数),但实际效率受问题特性影响。例如: - 在**最短路径**问题中,BFS首次到达目标即得到最优解,而DFS可能需要遍历更多路径[^2]。 #### 二、应用场景对比 | **场景** | **推荐算法** | **原因** | |------------------------|--------------|--------------------------------------------------------------------------| | 最短路径(无权图) | BFS | 天然按层遍历,首次访问即最短路径 | | 连通性检测 | DFS | 递归实现简洁,内存消耗低 | | 拓扑排序 | DFS | 后序遍历可逆序输出拓扑结果 | | 棋盘类游戏解(如八数码)| BFS | 需要穷举所有可能步骤,避免DFS陷入深层无效分支 | | 存在性判断(乐观情况) | DFS | 若可行解较,DFS可能更快返回;悲观情况与BFS相当[^2] | #### 三、代码实现示例 **DFS(递归实现,以二叉树为例)** ```python def dfs(node): if not node: return print(node.val) dfs(node.left) dfs(node.right) ``` **BFS(队列实现)** ```python from collections import deque def bfs(root): queue = deque([root]) while queue: node = queue.popleft() print(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) ``` #### 四、选择算法的关键因素 1. **问题需求**:是否需要最短路径或完整遍历。 2. **数据结构特性**:图/树的深度与宽度比例。 3. **内存限制**:BFS在宽层结构下可能消耗更多内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值