
搜索
SaltyFishWei
这个作者很懒,什么都没留下…
展开
-
POJ1077 HDU1043 Eight 八数码 (A*+康托展开)
题目大意:给出八数码的起点状态,求出能够到达到终点状态的步数的序列(不一定是要最短的步数)终点状态为:1 2 34 5 67 8 x思路:这道题有很多方法可以做,在这里我用的是A*算法。在保存每一步的具体路径的时候我们可以用康托展开。首先把每一位赋予一个权值,个位的权值是0!,十位是1!,百位是2!,千位是3!........然后统计当前数位在他后面比他小的数字有多少个,然原创 2015-07-26 16:54:38 · 507 阅读 · 0 评论 -
HDU2821 Pusher(DFS)
题目理解了半天- - 在r*c的网格上面放置有一些箱子,你可以选择任意一块个空地作为你的起点。有上下左右四种移动的操作。一旦选择了一个方向,你会不停地朝这个方向走下去直到的撞到了箱子。被你撞到的箱子会向你行走的方向移动一格,而且数量会减少一个(如果你是紧贴着箱子并且朝它行走,这样的操作是无效的)。如果箱子移动到的位置本来就有箱子,那么他们会合并为新的一堆。 请你寻找任意一个放置人位置和移动的方案原创 2016-03-27 21:34:26 · 352 阅读 · 0 评论 -
HDU4012 Paint on a Wall(BFS)
一开始确实没看出来什么玄机。然后搜了搜题解。由于最多只有16个格子,用二进制的状态压缩来表示,状态为1的位表示该位已经涂上了正确的颜色。 从第一行的i号节点开始向两边涂色的时候注意:如果刷到的这个节点已经是它本身的正确的颜色,那么我们就不刷了。否则这样又刷回了错误的颜色,就不是最优解了。然后把每扩展一个格子的状态全部压入队列,也就是代码中的tmp。 此外,同时刷两行颜色的时候只用考虑第一行就行了原创 2016-03-27 22:05:12 · 373 阅读 · 0 评论 -
POJ1475 Pushing Boxes(BFS+BFS)
题目就是推箱子的小游戏,叫你输出最优方案。推箱子用大写字母,人走用小写。 自己的想法:BFS乱搜。题解:双重BFS。涨姿势了,第一次见到。 外层BFS表示箱子要被推到的方向,内层BFS判断人是否能走到需要的那个位置;比如要往左推箱子,则要判断人是否能走到箱子的右边。 外层BFS还要开个数组判断是否在这个方向上经过这个点,不过我没理解透,估计再叫我写一遍我也写不出来。#include<cstdi原创 2016-03-27 22:22:21 · 392 阅读 · 0 评论 -
POJ1190 生日蛋糕(DFS)
N久以前写的一个迭代加深和神奇剪枝的搜索,如今我竟然写不出来,悲哀啊! 出答案很简单,但是要AC要加各种神奇的优化,我都写在代码的注释中了啦。#include<cstdio>#include<cmath>using namespace std;int best = 0xffffff,n,m,minv[25];void dfs(int i,int ri,int hi,int si,int v原创 2016-03-27 22:38:39 · 1143 阅读 · 0 评论 -
POJ2044 Weather Forecast(DFS)
假设你可以控制天气,你拥有一片2*2大小的云,在云覆盖的土地上无论何时都在下雨,否则一直是晴天。在一个国家的土地上你需要移动这篇云,第一天时云在(2,2)(2,3)(3,2)(3,3)上。现在有n(n≤365)n(n \leq 365)天,每天每块土地有些活动,1表示这块土地在这天有节日,不能下雨。除此之外,不能有一块土地连续超过6天不下雨。 若只把云看做左上角的点,那么一共只有9种位置状态。原创 2016-03-28 13:37:35 · 967 阅读 · 0 评论 -
POJ1324 Holedox Moving(BFS)
有一条蛇蜿蜒在洞穴里面,出口为(1,1),问(蛇头)走出洞口的最小步数。走的过程不能碰到自己的身体也不能碰到石头。蛇头每移动一格,身体也要相应的移动一格。(注意:貌似当前蛇头不能移动到当前蛇尾的位置) 由于蛇身占得位置太大,保存起来不方便,于是只用保存蛇头的位置,另外开一个二进制的串来保存其他身体块相对于上一块身体的位置,二进制的串每两位表示一个位置(也相当于4进制,每一个数表示一个方向)#inc原创 2016-03-28 14:30:19 · 373 阅读 · 0 评论 -
POJ3322 Bloxorz I(BFS)
很有意思的一个益智小游戏。题目我就不描述了,玩过的人都知道规则。 题目传送门:http://poj.org/problem?id=3322 空格子不能走(可以看成墙),标号为E表示脆弱的格子,箱子在上面不能竖放,只能横放。终点只能竖着放进去。 很明显是搜索题,状态表示也不用太费力去想。需要保存箱子一个角的位置,和摆放的状态f;如果箱子竖放,则位置就是它本身的位置,f=0;如果左右横放,则保存左原创 2016-03-28 14:43:26 · 650 阅读 · 0 评论 -
POJ2308 Dearboy's Puzzle(DFS+BFS)
连连看的小游戏(只有4种牌),判断是否能全部消除。思路非常简单但是要注意减枝。 外层的DFS指定一张牌来想办法消除它,内层的BFS以指定的这张牌为起点,向四周扩展找到能和它配对的牌。然后每一对能消除的牌都考虑一遍。 1.连的线不能越界到格子外边; 2.有的牌只有奇数个,无解 3.出现了 A B 这种情况而且,AB分别只有两张,那么肯定无解;不加这个减枝会超时。 。。。。B A#includ原创 2016-03-28 14:54:31 · 806 阅读 · 0 评论 -
HDU1226 超级密码(BFS)
由于n最大也只有5000,则对于枚举的密码s,s%n的状态也只有5000种。所以每一个枚举到的状态,开两个内容,一个表示密码的字符串,一个表示模n的余数,当余数为0的时候,说明找到密码。#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<cctype>using namespace std;原创 2016-03-27 21:20:44 · 401 阅读 · 0 评论 -
HDU1885 Key Task(BFS)
有一个迷宫还有四种钥匙,对应四种门,问走出迷宫的最少步数。 二进制状态压缩step[s][x][y]表示走到点x,y,获得钥匙的状态为s的最少步数。 类似于这道题:http://acm.hdu.edu.cn/showproblem.php?pid=1429#include<cstdio>#include<queue>#include<cstring>using namespace std;原创 2016-03-27 21:01:12 · 341 阅读 · 0 评论 -
HDU1429 胜利大逃亡(续)(BFS)
钥匙的数量并不多,状态压缩一下。step[s][x][y]表示走到点(x,y)获得钥匙的状态为s的最少步数。比如状态1001表示得到钥匙D和A。#include#include#includeusing namespace std;struct Node{ int s,x,y; Node(){} Node(int a,int b,int c) {s =原创 2016-03-27 20:49:12 · 309 阅读 · 0 评论 -
POJ1945 Power Hungry Cows (BFS)
题目大意:自己感觉非常奇葩的一道搜索题。给出n,求x^n。最先给出的两个数为x^1和x^0,可以执行如下操作:两个数相乘,其中一个数平方,两个数相除。问要达到x^n的最少步数。思路:把此题说得简单一点就是给定两个加数a = 1, b = 0;(在这里我们规定a总是大于b)每一部可以执行a*2,b*2,a-b之一的操作,使得目标状态达到n,每次操作之后新得到的值要替换掉原来的一个数。例如原创 2015-07-26 17:57:10 · 1066 阅读 · 0 评论 -
POJ3897 Maze Stretching (二分+BFS)
题目大意:给你一个地图,和路径长度L,起点和终点,上下走和左右走的距离为1,现在让你纵向压缩地图,改变上下走的距离,使得从起点到终点的最短距离恰好等于L。问应该怎样纵向压缩地图,保留3位小数。思路:Hint中已给出答案在0~10之间,因此我们可以用二分的方法枚举纵向压缩的比例,然后BFS验证是否能够使得走到终点的距离恰好为L。走的过程中注意剪枝,具体请看我的代码。还有,答案的精度貌似要原创 2015-07-26 16:32:43 · 517 阅读 · 0 评论 -
HDU2234 无题I (IDA*)
题目描述:一天机器人小A在玩一个简单的智力游戏,这个游戏是这样的,在一个4*4的矩阵中分别有4个1,4个2,4个3和4个4分别表示4种不同的东西,每一步小A可以把同一行的4个数往左移或者往右移一步或者把同一列的4个数字往上移或者往下移一步(1,2,3,4往左移后是2,3,4,1),小A现在想知道进过最少的几步移动可以将矩阵的每行上的4个数字都一样或者每列上的4个数字都一样。但是小A又不想走太多步,原创 2015-07-27 16:19:49 · 467 阅读 · 0 评论 -
HDU1560 DNA sequence (IDA*)
题目大意:给你n(n思路:搜索。很容易看出来最少步数大于等于最长的字符长度,因此估值函数h() = 同一字符串中所有剩余没匹配字母长度的最大值#include#include#define Max(a,b) a>b?a:busing namespace std;int n;struct T{ char s[10]; int len;}a[10];int原创 2015-07-27 17:09:15 · 430 阅读 · 0 评论 -
NOIP2009 靶形数独(搜索)
以前做过一道hdu类似的数独题,那道题我没有加什么优化就过了,然后这道题不加优化可以得50~80分,要上80分就必须要优化可以用位运算保存每一行每一列每个九宫格内已经使用的数,例如userow[i] = 011101111表示第i行还有1,5两个数字没有使用,那么我们枚举每个未知的格子(i,j)时,他不能填的数就是userow[i]|usecol[j]|usebox[i/3*3+j/3] ,其原创 2015-08-10 21:01:54 · 1759 阅读 · 0 评论 -
UVA529 Addition Chains (迭代+DFS)
题目大意:给定整数n,找出一个以n结尾的序列,序列的每个数都由前面两个数(可以相同)相加得到,输出合法的最短序列 思路:显然的搜索题。想要得到最短的序列,那么n最好由n/2相加得到,所以我们先求出最小深度,以最小深度为基础进行深搜。如果找不到合适的序列,那么深度+1继续深搜。还要注意剪枝,当前数为ans[now],如果它一直乘2(一直向下取最大值)还达不到n,则枚举下一个。#include<cst原创 2015-07-19 20:13:46 · 536 阅读 · 0 评论 -
UVA1354 Mobile Computing(DFS)
题目大意:给出房间宽度,重物个数n(n思路:显然的搜索题。由于重物的个数最多只有6个,因此我们可以状态压缩,用一个01串表示。然后暴力枚举左右天平的情况,用记忆化搜索。#include#include#include#define MAXN 1<<6#define Max(a,b) a>b?a:b#define Min(a,b) a<b?a:busing namespa原创 2015-07-20 08:36:50 · 499 阅读 · 0 评论 -
[USACO 2012OPEN] Balanced Cow Subsets(meet in the middle + DFS)
题目大意:给出n(n思路:设ai∈{-1,0,1},所求的集合可以视作Σai*xi=0,说得简单一点就是(以n = 6为例)a1*x1 + a2*x2 + a3*x3 + a4*x4 + a5*x5 + a6*x6 = 0显然枚举6个x肯定超时。于是我们采用meet in the middle的思路,拿出一半分成一组。a1*x1 + a2*x2 + a3*x3记为leftsum原创 2015-07-21 19:56:06 · 626 阅读 · 0 评论 -
POJ2688 Cleaning Robot(BFS+TSP问题)
机器人需要打扫在地图上不同位置的垃圾,地图上有的位置是墙无法经过。问打扫完所有垃圾的最少步数(不用回到起点)。 先用BFS求出垃圾们和起点两两之间的距离,再用一个DFS搜出最优解(类似于状压DP)#include<cstdio>#include<cstring>#include<queue>using namespace std;struct Node{ int x,y,stp;原创 2016-03-28 15:00:25 · 553 阅读 · 0 评论