搜索
文章平均质量分 71
accepoc
这个作者很懒,什么都没留下…
展开
-
hdu3295 An interesting mobile game (IDA*)
题意:一个6*6的矩阵,最多有4种颜色的棋子,相邻两个或两个以上相同颜色的棋子可以消掉。如果棋子下方有空,棋子会向下掉。如果一整列都被消完,右边的棋子会整体向左移。做法:ID+深搜。只不过每次从联通个数最多的棋子开始消。但是这样写完只有140ms。还有一个重要的优化:之前的代码是bool dfs(int step) { if (ended() && step == dep原创 2014-12-17 10:03:12 · 821 阅读 · 0 评论 -
poj2449 Remmarguts' Date (spfa+A*)
题意:给定一个有向图,求第k短路。思路:由于要求第k短路,所以只要保证spfa在每次扩展节点时都是当前的最短路,那么当第k次扩展到t的时候就是第k短路。那么如何求当前的最短路呢?假设有两个节点i,j,当前的距离分别为i.dist和j.dist,从i,j到终点t的最短路分别为d[i],d[j].那么,从i到终点最少需要i.dist + d[i]的路程,从j到终点最少需要j.d原创 2014-12-22 15:47:55 · 404 阅读 · 0 评论 -
poj3322 Bloxorz I (bfs)
状态用vis[x][y][d]表示,其中x,y表示两个方格坐标较小的一个的坐标,d表示横的还是竖的。d==0表示横的,d==1表示竖的,d==2表示立起来。然后裸的bfs即可,没什么技术含量。完整代码:#include #include #include #include #include #define INF 0x3fusing namespace std;原创 2014-12-22 21:34:03 · 368 阅读 · 0 评论 -
hdu1324 Holedox Moving (bfs+状态压缩+A*)
题意:一个贪吃蛇,地图上有障碍,问走到(1,1)的最少步数。思路:对于状态的表示,由于蛇身的方块一定是一个连着一个的,所以可以只记录蛇头的坐标,然后用一个2位的二进制数表示接下来每个方块的方向。这样状态只有20*20*2^14种,不会超内存。若当前贪吃蛇的状态为stat,接下来走的方向为pos,那么下一个状态就是:pos = (pos + 2) % 4;(stat >>原创 2014-12-22 19:05:36 · 394 阅读 · 0 评论 -
poj2688 Cleaning Robot (bfs+dfs)
题意:一个机器人从'o'出发,要到达所有的'*',问最少的步数。思路:把'o'和所有的'*'当作源点各做一次spfa,如果存在o到不了的点输出-1,否则dfs路径。完整代码:#include #include #include #include #include #include #define INF 0x3f3f3f3fusing namespace st原创 2014-12-23 08:48:21 · 402 阅读 · 0 评论 -
poj1376 Robot (bfs)
题意:一个机器人,在1s内可以顺时针或逆时针转身90°,或者向前走1~3步。问从起点到终点的最小步数。注意障碍的边缘也不能走。简单的bfs,用dist[i][j][k]记录到点(i,j),方向为k的步数。代码:#include #include #include #include #include using namespace std;struct Node{ in原创 2014-12-23 10:00:38 · 356 阅读 · 0 评论 -
poj1184 聪明的打字员 (bfs)
本题的重点在于剪枝。对于2,3,4,5号位置上的数字,只有当光标位于该位置上时才可以改变数字。所以当该位置上的数字和目标状态对应位置上的数字不同时,一定不会执行left或right。状态的表示用一个string,最后加上一位表示光标的位置。代码:#include #include #include #include #include #include #原创 2014-12-23 15:26:38 · 491 阅读 · 0 评论 -
hdu1732 Push Box (bfs)
三个箱子的推箱子。节点保存人的坐标,三个箱子的坐标和整个地图。判重用一个8维bool数组,表示人的坐标和三个箱子的坐标。注意当箱子的前方还有箱子的时候不能前进。代码:#include #include #include #include #include using namespace std;struct Node{ int x, y; int s原创 2014-12-24 11:31:53 · 439 阅读 · 0 评论 -
hdu4127 Flood-it! (IDA*)
题意:一个地图上有六种颜色,每次选择一个颜色,把(0, 0)所在的连通块全部染成此颜色。问把整个地图染成一种颜色的最小步数。思路:把(0, 0)所在的连通块标记为1,与该连通块相邻的方格标记为2。每次枚举选择的颜色,找到标记为2的点floodfill。当前的最优解就是剩余的颜色种数,如果该值加上dfs的深度step大于depth,剪枝(A*)。完整代码:#inclu原创 2014-12-25 16:10:44 · 450 阅读 · 0 评论 -
hdu2913 Traveling Cube (bfs+hash)
题意:一个立方体,六面都有一个颜色。给定一张地图,'w'可走无数次,'b'不可走,'r', 'g', 'b', 'c', 'm', 'y'都只能走一次,而且当立方体滚到这几种颜色上时,立方体的上表面必须是相同的颜色。给定经过这些有颜色的地方的顺序,也就是说必须按照给定的顺序依次走过这6种颜色,问最少步数。思路:节点记录一个pos,表示接下来要经过那种颜色。每次向四个方向扩展,如果是原创 2014-12-24 16:33:36 · 559 阅读 · 0 评论 -
hdu4090 GemAnd Prince (搜索+剪枝)
相邻的不少于3个宝石可以消除,得分为宝石的个数的平方。注意对角线相邻也算相邻。每次dfs时,先把地图copy一份,然后用floolfill染色,枚举每一个不小于3的连通块,先把地图复原,再按照题意变换地图,继续dfs下一层。核心代码:int map[11][11]; // 地图的副本memcpy(map, g, sizeof(map));memset(vis, 0, sizeof原创 2014-12-24 20:34:23 · 372 阅读 · 0 评论 -
hdu1401 Solitaire (双向bfs)
参考:http://blog.csdn.net/acm_cxlove/article/details/7753440先从起点开始搜4步,再从终点开始搜4步。判重先计算坐标的hash值,坐标都是0~7的,所以可以用一个三位的二进制数表示。注意计算之前先把坐标排序。代码:#include #include #include #include #include #i原创 2014-12-25 13:06:41 · 455 阅读 · 0 评论 -
hdu1560 DNA sequence (IDA*)
题意:给出几个字符串,求一个最短的字符串使得给出的字符串都是该字符串的子序列。思路:最多8个字串,长度不超过5,所以所求串的长度不超过40,用IDA*。每次枚举给主串后加的字符,如果给出的字符串中有能匹配的该串长度减一。剩余的最优解就是所有字串还未匹配的长度的最大值(A*)。代码:#include #include #include #include原创 2014-12-25 17:57:57 · 579 阅读 · 0 评论 -
hdu1254 推箱子 (bfs+dfs)
用箱子的位置和人的位置表示状态。bfs箱子,每次先用dfs求出人能走到的位置,然后枚举4个方向,如果箱子能走到并且人能走到相反的方向,就入队。判重用:bool vis[11][11][4];表示箱子的位置和人的方向。完整代码:#include #include #include #include #include using namespace st原创 2014-12-22 09:00:34 · 467 阅读 · 0 评论 -
poj2044 Weather Forecast (记忆化搜索)
题意:4*4的城市,2*2的云层。被云层覆盖的区域当天一定会下雨。有些区域在某些天不能下雨,并且不能有城市连续7天不下雨。云层开始在(1,1),(1,2),(2,1)(2,2),每天可以向4个方向移动1或2格或者不动,问是否能满足条件。思路:首先,判断是否有城市连续7天不下雨只需判断4个角即可。云的位置用左上角坐标表示。所以判重就可以用:bool vis[3原创 2014-12-22 11:40:49 · 600 阅读 · 0 评论 -
hdu3309 Roll The Cube (bfs)
题意:一个迷宫,里面有两个球('B')两个洞('H'),每次选择一个方向,两个球同时向这个方向移动一格,如果某个球前方有墙这个球就不动,某个球进洞时,该球和该洞同时消失('B' + 'H' = '.')。问最少多少步能将两个球都移进洞。迷宫的边缘一定都是墙。做法:bfs。只不过每个节点存的除了步数step,两个球的坐标x1,y1,x2,y2以外,还要存两个球进洞后的坐标(如果没进洞为-原创 2014-12-16 17:45:54 · 355 阅读 · 0 评论 -
hdu1195 Open the Lock (BFS)
题意:给出两个4位的数字,都由1~9组成,要求经过一系列的操作将第一个数字变为第二个数字。操作有两种,第一种:选择一位加上或减去1,9+1=1,1-1=9。第二种:交换相邻的两位。第一位和第四位不相邻。做法:简单bfs代码:#include #include #include #include #include #include using nam原创 2014-12-16 20:02:01 · 345 阅读 · 0 评论 -
hdu2102 A计划 (BFS)
节点记录x,y,z坐标和步数step,没什么难度。代码:#include #include #include #include #include using namespace std;struct Node{ int x, y, z, step; Node() {} Node(int a, int b, int c, int d) : x(a), y(b), z(c原创 2014-12-16 20:56:01 · 316 阅读 · 0 评论 -
hdu1226 超级密码 (BFS)
用数组保存当前的数,每次枚举每一个可以选的数加入数组。#include #include #include #include #include using namespace std;struct Node{ int num[511]; int len; Node() { memset(num, 0, sizeof(num)); len = 0; } void原创 2014-12-16 20:09:58 · 350 阅读 · 0 评论 -
hdu2614 Beat 简单dfs
题意:有n个问题从0到n编号,解决完第i个问题后解决第j个问题的耗时是Tij。现在可以以任意的顺序解决问题,要求解决第k+1个问题的时间必须大于等于解决第k个问题的时间(第0个问题永远第一个被解决且耗时为0),问最多能解决多少问题。做法:暴力即可#include #include #include #include using namespace std;int n;原创 2014-12-16 16:32:19 · 387 阅读 · 0 评论 -
hdu1429 胜利大逃亡(续) (BFS+状态压缩)
因为钥匙最多只有10个,所以可以用一个10位的二进制数表示拥有的钥匙。key[i][j]表示坐标(i,j)上有哪把钥匙,door[i][j]表示坐标(i,j)上有哪扇门。节点中保存的状态除了步数step,坐标x,y之外还有目前拥有的钥匙key。能否打开门只需要判断:if((key & door[x][y]) == door[x][y]) { /* next */}拾取钥匙可以表原创 2014-12-16 20:16:26 · 394 阅读 · 0 评论 -
hdu1885 Key Task(BFS+状态压缩)
此题和1429差不多,只不过可能有很多个出口。#include #include #include #include #include #include using namespace std;struct Node{ int x; int y; int step; int key; Node() {} Node(int a, int b, int s, int原创 2014-12-16 20:50:52 · 292 阅读 · 0 评论 -
hdu2437 Jerboas (搜索+剪枝)
题意:给定一个有向图,节点分为'T'和'P'两种。现在以其中一个T点为起点,要到达一个P点,其中:1.路径上的权值之和必须是k的倍数。2.路径必须最短。3.路径相同时取终点的编号最小的。4.可以选择任意一个P点作为终点做法:dfs。两个参数,当前的节点v和当前的路径长度now。dist[i][j]表示走到i点,now%k==j的最短路。每次dfs的时候,如果当前的路原创 2014-12-17 16:33:05 · 460 阅读 · 0 评论 -
hdu3681 Prison Break (dfs+二分+状态压缩)
题意:一个机器人一开始在F,D表示障碍,Y表示开关,G表示充电器。机器人每走一步消耗一点能量,走到充电器可以瞬间充满电(每个充电器只能充一次),现在要打开所有的开关(每个开关也只用打开一次),问最少的初始电量。首先计算出所有的G和Y两两之间的最短路,然后二分答案,用dfs判断是否能走完。代码里有注释:#include #include #include #原创 2014-12-18 11:40:24 · 363 阅读 · 0 评论 -
hdu1067 Gap (bfs+hash)
题意:给定一个4*8的矩阵,最左边一列是空的,右边4*7的格子被11~17,21~27,31~37,41~47这28个数字填满。首先把11,21,31,41移动到最左边一列,然后每次找一个空格,把空格左边加1的数移动到空格的位置。问多少步能走到目标状态。一看就是bfs,但是状态很大所以要用hash。每个状态的hash值这样计算:int getHash(int arr[4][原创 2014-12-19 10:18:07 · 469 阅读 · 0 评论 -
hdu2128 Tempter of the Bone II (BFS)
题意:doggie开始在S,要到D去。地图上有墙和炸药,炸药用1~9表示,代表炸药的数量。如果前方有墙,可以花费一个炸药和1秒炸开它,拾取炸药不花时间。问最小步数。这题一看就是bfs,但是判重有点困难。因为状态太复杂,所以节点必须保存整张图,但是这样又会MLE。但是发现地图最多是8*8的,于是我们可以用两个long long数,分别保存地图上的炸药和墙的状态,于是节点的定义如下原创 2014-12-20 09:19:00 · 1061 阅读 · 0 评论 -
poj3635 Full Tank? (bfs+heap)
题意:n个城市m条路,给出每个城市的油价,每组询问给出油箱容量,起点和终点,针对每组询问输出从起点到终点的最小花费。做法:最短路所以肯定是bfs。cost[i][j]表示到第i个城市,剩余油量为j的最小花费。每次从优先队列里取花费最大的,然后可以选择不加油,也可以加1个单位的油。这样第一次扩展到终点的花费就是最小花费。完整代码:#include #include原创 2014-12-22 10:05:47 · 440 阅读 · 0 评论 -
bzoj1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛 [BFS]
Description奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草。Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T (0 < T <= 15)秒后,FJ又在位置(R2, C2)与贝茜撞了正着。 FJ并不知道在这T秒内贝茜是否曾经到过(R2, C2),他能确定的只是,现在贝茜在那里。 设S为奶原创 2015-04-01 14:52:03 · 739 阅读 · 0 评论