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 }