bfs求最短路径 经典迷宫问题AC代码#include <iostream>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int N = 110;int n, m;int g[N][N], d[N][N];typedef pair<int, int> PII;queue<PII> q;int dx[4] = {
dfs全排列 C++有专门实现全排列的函数:next_permutation(start,end),这个函数在暴力解决问题方面有很大作用,使用时需要引入头文件algorithm,当当前序列不存在下一个序列时就会结束,若想得到一个序列的全部排列,那么使用前一定要记得先排序。int a[]={1,2,3,4};do{ cout<<a[0]<<' '<<a[1]<<' '<<a[2]<<' '<<a[3]<<endl; }w
几种排序笔记 快速排序void quick_sort(int q[], int l, int r){if(l >= r) return;int x = q[l + r >> 1], i = l - 1, j = r + 1;while(i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if(i < j) swap(q[i], q[j]);}quick_sort(q, l, j);qui
树状数组入门算法笔记 预备知识——前缀和A为N个数所在的数组,B为另一个新的数组令B数组的第 i 项为A数组的A1至Ai项之和即:Bi = A0+A1+A2 + …+Ai则有Bi = Bi-1 + A i(其中B0 = A0)特别的,有时候为了方便,AB数组都从下标1开始前缀和的主要用途?区间求和!二叉树变化后二进制最后一个1代表某个数,Ci从Ai往前数这么多项方法1:(易于理解)int lowbit(int x){ return x - ( x & (x - 1) ) ;}方法
STL在竞赛中的应用 STL栈的应用栈的特点:1、先进后出(FILO)2、从栈顶删除元素3、在栈顶加入元素常见操作:判断栈是否为空查询栈大小访问栈顶元素栈顶加入元素删除栈顶元素STL种栈的基本用法创建栈对象:stack<元素类型> 栈名;栈顶添加元素:栈名.push(元素名);删除栈顶元素:栈名.pop();访问栈顶元素:栈名.top();//要先确保栈非空判断是否为空:栈名.empty();返回栈的大小:栈名.size();说明:栈和队列一样,没有clear之类的函数,如果想要
记忆化DFS和基于优先队列的BFS算法笔记 记忆化DFS例1:斐波那契数列递推:效率高,可以避免很多重复的计算递归:优点:程序很简洁缺点:空间容易爆栈,时间慢int dfs(int n){ if(n == 1 || n == 2) return 1; else return ( dfs(n-1)+dfs(n-2) )%1000000007;}记忆化dfsint dfs(int n){ if(fib[n]) return fib[n]; if(n == 1 || n == 2) fib[n] = 1; else fi
每日一题acwing3768字符串删减 字符串删减原题链接题目描述:AC代码:#include <iostream>#include <cstring>using namespace std;int main() { int n; string s; cin >> n >> s; int ret = 0, cnt = 0; for(int i = 0; i < n; i++) { if(s[i] == 'x') {
每日一题acwing3769移动石子 移动石子原题链接题目描述:AC代码:#include <iostream>#include <vector>using namespace std;int main() { int T = 1; cin >> T; while(T--) { int n, d; cin >> n >> d; vector<int> a(n); for
每日一题acwing3769移动石子 移动石子原题链接题目描述:AC代码:#include <iostream>#include <vector>using namespace std;int main() { int T = 1; cin >> T; while(T--) { int n, d; cin >> n >> d; vector<int> a(n); for
每日一题acwing 3767 最小的值 最小的值原题链接题目描述:思路:贪心ai = bi时,p取何值都无所谓,与最终的和都没有影响ai < bi时,(ai - bi)* pi = -pi 要使S1-S2>0,那么pi就要尽量的小,p取1ai > bi时,(ai - bi)* pi = pi 正数的和减去负数的和大于0,pi尽可能的小,p = [(x + 1) / y]向上取整ceil() 向上取整函数floor() 向下取整函数round() 浮点数四舍五入AC代码:#include
每日一题acwing3764 三元数异或 三元数异或原题链接题目描述:思路:贪心,假设a>=b;确定第一位是2,那么a和b的第一位一定都是1;当x出现0时,a和b都加’0‘;当x出现1时分两种情况:1、已经确定a>b了,那么a+‘0’,b+‘1’2、没确定a>b,那么a+‘1’,b+‘0’, 然后a>0当x出现2时,分两种情况:1、已经确定a>b了,那么a+‘0’,b+‘2’2、没确定a>b,那么a+‘1’,b+‘1’,AC代码:#include <iostream>
组合博弈入门算法笔记 组合博弈入门算法笔记取子游戏:什么是组合游戏——有两个玩家;游戏的操作状态是一个有限的集合(比如:限定大小的棋盘);游戏双方轮流操作;双方的每次操作必须符合游戏规定;当一方不能将游戏继续进行的时候,游戏结束,同时,对方为获胜方;无论如何操作,游戏总能在有限次操作后结束。概念:必败点和必胜点(P点&N点)必败点(P点):前一个选手(Previous player)将取胜的位置成为必败点。即下一个选手必败。必胜点(N点):下一个选手(Next player)将取胜的位置成为必
二分匹配算法笔记 二分匹配二分图的最大匹配在二分图的应用中,最常见的就是求————最大匹配很多其他的问题都可以转化为匹配问题来解决匈牙利算法题型:真正求二分匹配的题目很少,往往做一些简单的变化比如:二分图的最小顶点覆盖什么是二分图的最小顶点覆盖?在二分图中求最少的点,让每条边都至少和其中的一个点关联,这就是:二分图的”最小顶点覆盖“。一句话记忆:最小顶点覆盖就是用最少的点覆盖所有的边变化(二)DAG图的最小路径覆盖什么是DAG图的最小路径覆盖?用尽量少的不相交简单路径覆盖有向无环图(DAG)的所
每日一题acwing3763数字矩阵 数字矩阵原题链接题目描述:思路:选两个相邻元素变换,因为同一个元素可以被多次选中,则可以任意交换两个位置元素的符号而中间元素符号不变,如果负数的数量为偶数,则可以两两抵消全部都变为正数,负数的数量为奇数,那么将绝对值最小的那个数变为负数AC代码:#include <iostream>#include <algorithm>#include <cmath>using namespace std;int arr[15][15];int main()
DFS入门算法笔记 预备知识二叉跟的遍历1、先根遍历(根左右)2、中跟遍历(左根右)3、后根遍历(左右根)先根遍历结果:271653894中根遍历结果:175632849后跟遍历结果:153674982给定先根中根遍历结果,可唯一确定二叉跟给定中根后跟遍历结果,可唯一确定二叉根给定先根后根遍历结果,不能确定二叉跟深度优先搜索(DFS)深度优先搜索基本模型:深度优先搜索的关键在于解决“当下该如何做!”至于下一步该怎么做,则与当前一样(只是参数不同而已)。伪代码:void dfs(int s
每日一题acwing3761 唯一最小数 唯一最小数原题链接题目描述:思路:用哈希表,记录当前数出现的次数和位置AC代码:#include <iostream>using namespace std;#include <map>#include <string>#include <algorithm>const int N = 200010;int arr[N];int main(){ int T; cin >> T; while(T
每日一题acwing3762二进制矩阵 AcWing 3762. 二进制矩阵 原题链接思路:暴力解法,不是最优解,九宫格,分四种情况,右下角最后一个格子,最后一列,最后一行,其他情况,四个格子做三次交换就可以只把其中一个格子改变,其余三个不变AC代码:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 110;int n,m;char g[N][N];
HDOJ 1372Knight Moves 跳马移动原题链接题目描述:思路:BFS,借用二维数组使用for循环遍历八种情况,这样就不用一个一个写了AC代码:#include <iostream>#include <string.h>#include <algorithm>#include <queue>using namespace std;struct node{ int x, y; int steps;}now,nex,target;int m,n,s
HDOJ 1495非常可乐 非常可乐原题链接题目描述:思路:当可乐总量为奇数时,不可能均分,直接输出结果;将i被子倒入j杯中时,分两种情况,一种是能倒完,一种还有剩余AC代码:#include <iostream>#include <queue>#include <string.h>using namespace std;int N,M,S;struct node{ int num[3]; int steps;//次数}now,nex;int vis[1
HDOJ 1548A strange lift A strange lift原题链接题目描述:思路:树的层次遍历,典型的BFS题目,注意标记,不要添加已有的楼层AC代码:#include <iostream>#include <algorithm>#include <queue>using namespace std;int N,Start,End;int a[202];//记录每层楼上下的层数int vis[202];//做标记struct pos{ int level;//