BFS+二分法类 思想&基础题

文章介绍了BFS的基本思想,强调其在寻找最优解和最短路径问题中的应用,并提供了一个基于队列实现的BFS路径寻找问题的实例。同时,文章概述了二分法的原理,指出其需在有序数据中查找,并展示了一个在有序数组中进行查询的二分法实例。
摘要由CSDN通过智能技术生成

BFS+二分法基本思想和基础类模板题

忙了快两周的项目,算法这边进度比较缓慢,总结一下近来的学习情况

BFS思想和基础题

1. BFS基本思想

如果说DFS是不撞南墙不会头的话,BFS就是一石惊起千层浪,泛起层层涟漪,深度优先搜索旨在不管有多少条岔路,先一条路走到底,不成功就返回上一个路口然后就选择下一条岔路,而广度优先搜索旨在面临一个路口时,把所有的岔路口都记下来,然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路,并重复这样的操作。
适用于求最优解的问题,或最短最小路径
1.从A出发是否存在到达B的路径;DFS也可求
2.从A出发到达B的最短路径;数据小20以内的话,DFS也不是不可以
在这里插入图片描述

2. BFS基础题

eg:爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在1,1处,车站在心2,2处。现在给出一个n×(n≤1000)的地图,0表示马路,1表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(每两个相邻坐标间距离为1)。你能帮他解决吗?
题目链接:https://www.luogu.com.cn/problem/P1746
通过控制队列,来实现广度优先搜索,因为队列是先进先出的
起始:将起点(源点,树的根节点)放入队列中
扩散:从队列中取出队头的结点,将它的相邻结点放入队列,不断重复这一步
终止:当队列为空时,说明我们遍历了所有的能到的结点,整个图能到的点都被搜索了一遍
为什么需要队列:
正如以上所说,我们需要一层一层去遍历到所有结点,那么相邻结点的访问顺序如何确定?因此我们就需要一个数据结构去存储和操作,需要使得先遍历到的结点先被存储,直到当前层都被存储之后,按照存储的先后顺序,先被存储的结点也会被先取出来继续遍历他的子节点,综上所述,需要一种特点为先进先出的数据结构也就是队列。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
//定义队列q
typedef pair<int,int> PIL;
queue<PIL> q;
/*
第二种方式定义队列q
struct Node{
	int x,y;
};
queue <Node> q;
*/
const int N = 1001;
char arr[N][N];//存放地图
int t1, t2, x2, y2;//t1,t2起始点坐标  x2,y2终点坐标
int dist[N][N];//存放到起始点的距离dist[3][2]=2 代表(3,2)到起始点长度是2 
int n;
//定义向量数组
int dx[] = {
    -1,0,1,0 }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值