搜索
hhyy_d
这个作者很懒,什么都没留下…
展开
-
BFS中的多源BFS-双端队列BFS
BFS找到的答案为什么一定是最小的?证明:BFS队列具有两段性:队列中同时存的所有点到起点的距离差值最多是1。BFS队列具有单调性:分成两段性,前面一定是小的。数学归纳法证明:1.初始的时候距离为0成立2.假设队首的某个点距离起点为x,把它能扩展的点加到队尾,距离为x+1,仍然满足两段性和单调性。因此队列中的所有元素都满足上面的两个性质例题1:矩阵距离这个题思路就是首先将起点加入到队列,然后正常的bfs就行把棋盘堪称一整个点,把这个点变成其他的点要经过多少步骤...原创 2022-03-09 21:53:33 · 279 阅读 · 0 评论 -
BFS中的Flood Fill和最短路模型
Flood Fill核心思想:对每次加进来的格子判断是否能够加入新的格子可以在线性时间复杂度内,找到某个点所在的连通块。宽搜是不会爆栈的,深搜可能会爆栈。找连通块。在算法题里面一般栈空间为1M,100000层可能就会爆。例题 :池塘计数学到一个新写法:判断八联通用两重循环for(int i = t.x-1;i<=t.x+1;i++){ for(int j=t.y-1;j<=t.y+1;j++) { if(i==t.x&&j==t.y) c原创 2022-03-09 17:08:09 · 223 阅读 · 0 评论 -
回溯法解决不重复的全排列问题
在全排列问题上加上一个剪枝就是如果当前的arr(i)==arr(i-1)(解空间树的同一层)同时visited[i-1]没有被访问过,说明就重复了。注意初始数组一定要有序,否则需要进行排序class Solution {public: vector<vector<int> > res; vector<int> path; int visited[10]; void dfs_back(vector<int> &nu原创 2021-11-14 23:40:01 · 886 阅读 · 0 评论 -
力扣不重复子集
解题思路:1.回溯法,不重复子集在同一层解空间树上不能选择同一个元素,但是一个树枝上可以选择同一个,于是在for循环中加入一个条件就是后一个元素不等于前一个元素。//在解空间树的同一层不同选相同元素,在统一树枝上可以选class Solution {public: vector<vector<int> > res;//保存结果 vector<int> path; void backtrace(vector<int>&.原创 2021-11-14 22:14:42 · 606 阅读 · 0 评论 -
P1135 奇怪的电梯
解题思路:回溯法,对每一个楼层都有上下两种方法,只要合法(>=1&&<=n)都可以去。结束递归的条件是当前的step大于res,记得回溯修改已经访问的点为未访问。#include<bits/stdc++.h>#define MAX 201using namespace std;int n,a,b;int arr[MAX];//存储每一层电梯的数字int visited[MAX];//该层是否访问过int flag=0;//是否有解int res =..原创 2021-11-13 17:58:49 · 552 阅读 · 0 评论