随笔分类 - 搜索
dfs bfs
摘要:#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include<string>using namespace std;#define LL long longbool vis[1005][1005];int go[3][2]= {{1,1},{-1,1},{0,1}};int n,L[1005],R[1005];struct point{ int x,y,st
阅读全文
摘要:题目意思:此时你身在错综复杂滴迷宫中,你身上带了个定时炸弹,问你能不能从原点到出口,如果可以,输出最小步数,否者输出-1。条件:1、迷宫可以用二维数组表示2、你可以走上,下,左,右4个方向,每次走一格3、如果你抵达出口的时候,定时炸弹时间已经为0了,那么你还是悲剧滴被炸死了T^T4、如果你到达一个充满神奇魔法的地方,你的定时炸弹会重新设置时间为65、不管多少次到达那个充满神奇魔法的地方,你的定时炸弹都可以重新设置时间为66、如果你到达那个充满神奇魔法的地方时,定时炸弹时间已经为0了,那么恭喜你,你飞仙化羽了~ ~map:如果map[i][j]==0,则这个点为墙壁如果map[i][j]==1,
阅读全文
摘要:dfs有别于BFS:一条路走到底,所以对于大数据的题目,剪枝对dfs来说十分关键。写dfs的步骤:1、思考参数们代表的状态2、思考递归出口3、思考如何剪枝4、思考如何进入下一状态模板:const int MAXN=100bool vis[MAXN],compress[10<<1];//compress,状态压缩int wan[MAXN][MAXN];void dfs(/*参数们*/){ if(/*递归出口条件*/) { //do sth return; } for(int i=1;i<=N;++i) //递归入口 { ...
阅读全文
摘要:BFS:找到的路径长度一定是起点到终点的最短路径构思BFS的步骤:1、确定队列结构体要记录什么东西,一般为x,y坐标,累加的路径长度r2、确定入队条件3、确定终结条件模板:int map[M][M],wan[M][M]; //map是图;wan是弯的数量,主要用来剪枝int go[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; //go表示走上、下、左、右方向struct node{ int x,y,turn,road; node() {} node(int a,int b,int c,int d) //构造函数 { x=a; ...
阅读全文
摘要:/*题目意思:相信大家都知道搜狗拼音的词语联想功能。这题的大致意思就是根据你的字典里的词出现的频率,把词语联想的功能模拟一遍。每多一个按键,你只需输出第一联想到的东西,如果没有,就输出MANULLY。一个按键对应一个字母,但是一个按键有3或者4个选择的字母。注意:在你查询过程中,是不会额外增加单词的。这题真的花了我不少时间~T T,过去用的字典树模板实在是通用性太差劲了。终于给我百度到一个挺好的模板。字典树的最大复杂度为Q(n),n代表字符串的长度。我真心没有想到这题可以用字典树+深搜做~,思路也是百度来的。经过抄袭了N个大神的模板和学习后,整理如下:AC状态:0ms 660KB*/#incl
阅读全文
摘要:/*看到这题的限时和空间~,马上不用纠结了,暴搜+剪枝必过要是哪个大神能告诉我更好的剪枝步骤,我会很感激的。因为我的代码简直是蜗牛速度~456ms 4900KB水过*/#include <iostream>#include<cstdio>#include<cstring>#include<queue>#include<set>#include<memory.h>#include<algorithm>using namespace std;#define inf 0x3ffffff#define M 1005in
阅读全文
摘要:/*RESCUE*/#include <iostream>#include<cstdio>#include<cstring>#include<queue>#include<set>#include<memory.h>#include<algorithm>using namespace std;#define maxn 220char start[6],end[6];bool vis[10005];struct re{ int str[4]; int num; re(const char *a) { num=0;
阅读全文
摘要:/*T T坑爹的八数码*/#include<iostream>#include<queue>#include<utility>#include<set>#include<cstdio>using namespace std;#define maxn 300char dir1[4]= {'u','d','l','r'};char dir2[4]= {'d','u','r','l'};char rr[maxn];
阅读全文
摘要:/*dfs,剪枝是关键。╮(╯▽╰)╭本来是想一根棍子一个棍子的填充,遇到棍子不合适的就回溯。但是实验证明这绝对是剪错方向的!正确的解法是。。。先寻找第一根棍子合不合适,如果不合适就没有必要找下去了,这是关键点。这题堪称剪枝之最啊~~~~~*/#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>using namespace std;#define M 100typedef long long LL;int N,a[M
阅读全文
浙公网安备 33010602011771号