搜索
aozil_yang
这个作者很懒,什么都没留下…
展开
-
POJ 2790 Consecutive ones (搜索 + 剪枝)
大体题意:给你一个n*m的0-1矩阵(n,m 思路:因为保证了答案唯一,所有正解只有一个,因此不合法的情况会有很多,因此我们可以考虑 搜索 + 剪枝的方案。矩阵只有0 和1 因此一个位置要么填0要么填1,这两种方式都考虑到剪枝就可以很轻松的过了!最先想到的肯定是枚举列,在枚举每一行检测是否合法!剪枝方法:如果这一列这一个位置是1的话,那么前面的一个位置也必须是1,否则就原创 2017-01-11 14:23:02 · 338 阅读 · 0 评论 -
UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
大体题意:给你一个r*c的数字矩阵,要求从任意一个点开始走,只能上下左右走, 求走的过数连接起来最大是多少?思路:直接dfs每一个数字,在每一层dfs中,加上bfs 判断剩下的数连接起来能否大于当前的ans 不能的话 剪枝了。虽然思路是这样的,但昨天一直TLE, 或许姿势不对,第二天重写了一遍 就好很多了= =#include #include #include #inc原创 2017-02-25 10:36:48 · 551 阅读 · 0 评论 -
例题7-9 UVA - 1601 && POJ 3523 The Morning after Halloween (双向BFS)
大体题意:你给一个h*w 的网格,网格上最多有三只小鬼,小鬼用小写字母abc 表示,他们的目标用ABC表示,问小鬼移动到目标最短的步数,他们可以同时走,走法有五种:上下左右和不动,其中有几种情况的走法是非法的:1.两只小鬼一步以内交换了位置。2.两只小鬼的下一步是同一个位置。其余情况合法!思路:先将不是#的位置变成标号。然后把所有空格提出来建立一张图,把初始位置原创 2016-05-29 13:00:01 · 729 阅读 · 1 评论 -
例题7-8 UVA 10603 Fill 倒水问题
完全仿照紫书上来写的!书中大体思路是:用ans[]来记录答案,不断取最小值来更新!用vis[][]来表示是否访问过,之所以是二维数组,是因为总水量是固定的,两个杯子确定,第三个杯子自然也就确定,两个状态足矣!用结构体表示每一个状态!其中包括每个杯子的水量!u.wat[],还有dist 为到目前这个状态总的取水量!然后用优先队列不断倒水,有一个技巧,代码中先算出需要倒的水量,原创 2016-03-04 07:57:09 · 848 阅读 · 0 评论 -
POJ 1077 Eight (正向BFS + 康托展开)
题意不说了 八数码问题:和上篇博客 HDU 1043 题目是一样的!但是做法上有些出入。HDU 时间限制比较长,而且是多组输入,所以要逆向bfs 进行打表处理。而POJ 1077 这个题目,时间是1S ,单组输入。因此输入一组 搜索一组即可。9个数的排列 判重用康托展开来做。但是这个队列要自己写,STL的queue 会超时。自己写的队列,在输出时 能很方原创 2017-01-24 16:25:24 · 731 阅读 · 0 评论 -
HDU 1043 Eight ((八数码问题)逆向BFS + 康托定理判重)
题意不说了,就是一个八数码思路:很暴力,直接把空格看成0,然后把九个数字连接起来,用这个数来代表这个状态。然后正常来想这个题目时,肯定是 从给定状态到目标态来bfs搜索,但是这样做死活爆内存 (好难受= =)我们需要转个弯,从目标态向给定态搜索,这样可以直接预处理打表了。正好这是一个9个不同数字的排列,用康托定理完美去重。注: 用c++交的,G++还是爆内存= =#in原创 2017-01-23 21:58:55 · 793 阅读 · 0 评论 -
例题7-7 UVA 1354 Mobile Computing (搜索+二叉树(类哈夫曼树))
思路:想一想就可以知道,一个结点要么有两个儿子,要么没儿子。那么这就很像哈夫曼树,因此我们可以枚举所有的哈夫曼树(任意枚举两个不同的结点来合并)然后从根结点开始遍历二叉树,在遍历的同时,来枚举左边 和右边的最大值。然后R-L 便是这个二叉树的宽度。更新一下答案即可!有一个小小的坑把,没注意到:就是只有一个砝码的时候,答案应该是0 不是-1.想一想还是很实际的:只原创 2017-01-22 16:17:21 · 404 阅读 · 0 评论 -
UVA 307Sticks(dfs搜索)
大体题意:给你n个木棍,要求分配这个n 个木棍到x组,使得x组的木棍长度和都相同,问最小的长度和是多少?思路:直接搜索:需要加很多剪枝才能过:1.首先你枚举时,应该枚举组数,而不是长度和,否则循环会很长。2.如果第一个木棍选完了,没找到合适的使它权值和为枚举的答案,就不可能有答案了。3.如果第i个木棍能组成ans,但其余的不能了,也不能有答案了。4.当长度小于ans原创 2017-02-20 00:35:30 · 348 阅读 · 0 评论 -
例题7-5 UVA 129 Krypton Factor (困难的串,搜索)
题意:给你n 和l ,求出按字典序来算第n小的由前l 个字母组成的困难的串,如果一个字符串中包含两个相邻的重复子串,那么是容易的串,否则是困难的串。思路:直接搜索即可!当枚举到第c 位时,我们只需要判断后缀是否重复即可,因为前面的都已经判断过了。另外如果一个字母一个字母枚举的话,那么就已经保证了字典序的顺序了,无需在排序了。输出格式注意下即可。#include #incl原创 2017-01-20 14:02:00 · 416 阅读 · 0 评论 -
例题7-4 UVA 524 Prime Ring Problem
题意:给你数字n ,求的一个1~n 的数字环,使得任意相邻的数的和为素数! 打印所有解。思路:直接素数打表判断素数,回溯法暴力每一个位置的每一个数即可。#include #include #include #include #include using namespace std;unordered_mapmp;int vis[100];void init(){原创 2017-01-20 13:13:15 · 279 阅读 · 0 评论 -
例题7-10 UVA 11212 Editing a Book (IDA*搜索)
大体题意:给你一个n 个数全排列数组,要求你可以选择一个连续的序列 随便插到一个位置,求最少几步 能到达严格上升的序列?思路:正解是IDA*搜索。一开始简单的以为是BFS ,一想 他还是一个 全排列的数组 用康托展开不正好可以完美哈希么,就写了个bfs 加了一些剪枝 ,9个数的数据跑的非常慢。应该用dfs。根据刘汝佳的分析,有几个地方分析的非常巧妙。我们可以利用后继不原创 2017-02-09 15:13:40 · 374 阅读 · 0 评论 -
蓝桥杯 历届试题 九宫重排 (八数码问题--康托展开去重 + bfs搜索)
题意:简单的八数码问题:给你两个状态 求最少步数。可以把点变成9:这样,9个数都不一样,相当于是阶乘的排列。直接用bfs 搜索 康托展开去重即可。#include #include #include #include #include #include #include #include #define Siz(x) (int)x.size()#defi原创 2017-04-20 20:45:13 · 1634 阅读 · 2 评论