
ACM之搜索
文章平均质量分 59
noname40
这个作者很懒,什么都没留下…
展开
-
poj 2488 dfs(骑士环游世界)
这是我在新浪写的第一篇博文了吧,嘿嘿,把它也贴过来。一个经典的dfs。#includeusing namespace std;#define max 26int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//定义八个方向 因为要按字典树输出 //棋盘应该是按照下面形式分布的(因为这样符合数组原创 2012-01-18 01:16:13 · 646 阅读 · 0 评论 -
poj 1501 dfs(找字符串)
题意:给出一个字符矩阵,然后下面每一行的字符串和其匹配,只能按照直线进行匹配,横、竖、斜。如果匹配成功则输出首字母和末字母匹配成功的位置。思路:DFS,如果找到下一个字母,就继续搜。#includeusing namespace std;char a[105][105];int N,len2,sx,sy,ex,ey;bool flag,vis[105][105];char s[1原创 2012-02-02 15:40:18 · 862 阅读 · 1 评论 -
hdu 1242 bfs
题意:这道题原来WA了好久,今天稀里糊涂的过了,因为angel的朋友有很多,所以要从a开始搜索,但是题中说必须杀死守卫啊。。。 貌似不一定杀死x也可以救出angel...理解错了。#includeusing namespace std;struct point{ int x,y; int step;}; point p[420];int dir[4][2]={{-1,0},原创 2012-02-03 12:40:04 · 327 阅读 · 0 评论 -
poj 1321 dfs棋盘方案
题意:给出棋盘分布情况和棋子数,要求任意两个棋子不能在同一行或者同一列。思路:逐行搜索按列标记,就能保证棋子摆放的位置正确。这道题开始用方向数组的方法做,结果不对,后来上网看下别人代码,参考了这种方法,但是如果找到了一种情况,此时该行所对应的所有列都已经没有符合的位置了,也搜不下去了。。又卡在这里了。最后看了下,又加了一条语句 dfs(i+1,num); 移动到下一行,果断过了。#in原创 2012-02-03 18:36:31 · 403 阅读 · 0 评论 -
poj 2192 DFS+剪枝
题意:在不改变前两个字符串原始顺序的情况下,看能否组成第三个字符串。思路:DFS+剪枝。递归三个字符串的下标,如果第三个字符串中的字符和前两个字符串中的字符有相等的,那么继续搜索,直到搜索到第一二个字符串的结尾。这道题让我对回溯有了更深的认识,自己瞎写的代码超时了,然后上网搜个剪枝加上依然超时。。。后来参考了下这个代码。http://blog.163.com/boatswain@126原创 2012-02-03 13:55:16 · 341 阅读 · 0 评论 -
hdu 1175 DFS连连看
题意:中文题就不说了。思路:DFS,关键是那个转折大于两次就不行的情况怎么深搜,可以枚举递归起始点的四个方向,如果在DFS中的方向K和递归中的不一样而且还满足深搜条件,那么转折次数就加一。这道题WA了好长时间,最后在网上搜的测试数组,然后对比出了几个错误,终于艰难的AC啦~ 灰常爽!AC代码:#includeusing namespace std;int dir[4][2]=原创 2012-02-05 10:59:55 · 502 阅读 · 0 评论 -
hdu 1181 dfs
题意:中文题,不解释了。思路:DFS。从'b'开始搜,“首尾”的搜索,知道找到'm'。终于AC了,虽说代码比较搓了,但是也是比较开心啦,呵呵~#include#includeusing namespace std;char s[200][200];bool flag1,flag2;int t;bool vis[200];void dfs(int i,char c){原创 2012-02-04 19:12:30 · 372 阅读 · 0 评论 -
poj 1573
题意:看图就能明白。一种情况是走出迷宫,一中情况是死循环,分别输出走出去用的步数,还有多少步开始出现环,还有走一个环需要的步数。思路:第一感觉就是DFS,但是自己写了个代码,各种案例都可以通过,依然WA,最后无奈只有参考了网上的代码。http://hi.baidu.com/niren_cn/blog/item/cd76cca6d23733b6caefd0c0.html#includ原创 2012-02-07 13:12:16 · 364 阅读 · 0 评论 -
poj 1020 拼蛋糕
题意:给出正方形蛋糕的边长,然后给出一些小蛋糕的边长(正方形),看这些小的正方形能不能拼成这个大的蛋糕.思路:感觉就是个二维的 1011..但是写起来还是悲剧啊...最后还是看了解题报告... 这种搜索的技巧,还真难掌握... 具体注释,看代码#includeusing namespace std;//从上到下从左到右 搜索 int cnt[20],len[50];//cn原创 2012-02-19 12:22:04 · 563 阅读 · 0 评论 -
poj 2251 三维BFS
题意:在三维的图里从S走到E,'.'可以走,'#'不能走,求最小步数。思路:水BFS。#includeusing namespace std;struct point{ int x,y,z; int step;}P[30000];int dx[6]={-1,1,0,0,0,0};int dy[6]={0,0,1,-1,0,0};int dz[6]={0,0,0,0,1原创 2012-02-26 23:32:12 · 363 阅读 · 0 评论 -
poj 1010 邮票问题 DFS
原文地址:http://hi.baidu.com/you289065406/blog/item/8c4395033c085d0b738b6502.html大致题意:题意比较难懂。大致如下:第一行数字是邮票的面值,每一个数字就是一个不同的种类,哪怕面值相同。以0结束。第二行数字是顾客所需要的邮票总面值。每个数字就是一个顾客的需求,以0结束。每两行是一组case。以EOF结束输转载 2012-02-19 21:03:49 · 590 阅读 · 0 评论 -
poj 1471 dfs 搜索三角形
题意:在字符是'-'的区域中,找出最大的三角形。思路:枚举'-'的地方作为三角形的顶,搜索三角形。注意,跟原图对比,判断三角形是正的还是倒的。。。#includeusing namespace std;int sum , len;char map[220][500];int dfs(int y,int x) { int st = y; int ed = y; int h =原创 2012-03-27 21:02:50 · 720 阅读 · 0 评论 -
poj 1088 滑雪[zz] 记忆化搜索
题意:给出一些高度,从一个位置划只能往周围四个方向滑,且高度递减。。求最长的滑行区域。 这道题应该是用DP做,但是没咋搞过DP所以也木有什么想法。。在网上看可以用记忆化搜索做,记忆化搜索 = 搜索方式 + DP思想 ,大概的意思就是把已经搜过的节点状态保存起来,避免重复搜索的一种方法,有待理解加以应用。代码中的step数组 就是 记录了从该点划的最长区域,当再搜到这个点的时候,就不原创 2012-03-27 20:39:54 · 473 阅读 · 0 评论 -
hdu 4158 GO
参考于:http://hi.baidu.com/upc_refresh/blog/item/9f08f5bb85adc5aeca130c6a.html题意:求黑白棋子哪一个棋子围住的空白地方多。思路:DFS没有棋子的地方,同时记录边界是黑白棋子的个数,如果黑棋子个数是0,那么白色棋子围住的地方等于搜到的地方,反之相反。#include#includeusing namespace原创 2012-05-31 11:25:01 · 609 阅读 · 0 评论 -
zoj 1002 dfs / 最大匹配 碉堡
题意:“.”的地方可以放碉堡,“X”的地方是墙壁,要求在图上放碉堡,但是碉堡的上下左右四个方向不能有碉堡,除非有“X”墙壁隔着,求最多可以放的碉堡数。思路:dfs哎。。。DFS能力还是不到位啊。。。有时间要试试用匈牙利写,因为想练练二分图。#include#include#includeusing namespace std;char map[10][10];原创 2012-05-31 21:04:27 · 636 阅读 · 0 评论 -
hdu 1428 漫步校园 优先队列BFS +记忆化搜索
参考:http://blog.sina.com.cn/s/blog_7fec44cf0100ypaq.html题意:从(1,1)点开始走,终点是(n , n),每走一步都要保证距离终点最近,如果和A区域相邻的四个区域离(n,n)点,比A点离(n,n)点更近,那么就可以走,求到终点的方案数。思路:如何判断一个点是否离终点更近?用优先队列的BFS求终点到其它各个点的最短距离,并保存在数组中。(原创 2012-06-05 11:23:33 · 539 阅读 · 0 评论 -
hdu 4198 杭电系列赛(四) BFS + 优先队列
题意:给出一个矩阵h*w,起始点是"S","#"不能走,且矩阵四周用#围起来,边界不是"#"的地方代表出口,遇到“.”的话时间加一,遇到“@”的话时间加(d+1),求从起点离开这个矩阵的最小时间。思路:普通的BFS不可破,应该用优先队列的BFS,由于出口不唯一吧,所以要写好BFS的出口条件!//bool operator if (tim > a.tim) return原创 2012-05-08 10:07:21 · 1395 阅读 · 0 评论 -
poj 1154 dfs
题意:只能上下左右的移动,问最多能找到多少个不同的字母,相同字母的位置不能移动到。思路:深搜,其中标记数组的方式是把字母映射到整型数组里。#includeusing namespace std;char map[30][30];bool vis[27];//字母映射的方式来标记 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int n,m,a原创 2012-02-01 14:18:21 · 329 阅读 · 0 评论 -
poj 3984 BFS+DFS(保存路径)
题意:给出的矩阵0可以走,1不可以走,求(0,0)到(4,4)的最短路,并输出一条最短路径。思路:用BFS求最短路,同时各个点的前驱节点,也就保存了路径,最后DFS从(4,4)搜回去,就可以输出路径了。#includeusing namespace std;struct point{ int x,y; int pre_x,pre_y;//图上的点及其前驱节点}node[5]原创 2012-01-18 01:55:36 · 1275 阅读 · 0 评论 -
poj 2243 bfs(还是骑士移动)
这道题跟 1915 是一样的,通过这道题主要学习了 从字符串中分离出字母和数字的方法。#include#includeusing namespace std;#define max 10int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};int vis[max][max],step[max][原创 2012-01-18 01:31:13 · 573 阅读 · 0 评论 -
poj 3278 bfs(Catch That Cow)
这道题基本上就是骑士移动(poj 1915)的一个一维的变形,值得借鉴的是方向数组的定义方法,因为这题有三种移动情况:移动到当前位置加一,减一,或者当前位置的二倍的位置。所有请看代码里的方向数组的定义方法,很巧妙。其它没什么了,也是求最少步数,当广搜到终点的时候就返回。#includeusing namespace std;int dir[3][2]={{1,1},{1,-1},{2,0}原创 2012-01-18 01:33:29 · 328 阅读 · 0 评论 -
poj 1915 第一个双向BFS
第一个双向BFS,搞了好几天,AC了,非常HAPPY!#includeusing namespace std;int dir[8][3]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};int step[305][305],xx[90105],yy[90105],vis[305][305],l;//step数组记录了原创 2012-01-18 01:40:44 · 572 阅读 · 0 评论 -
hdu 1495 bfs 非常可乐
题意:输入s,m,n三个数,分别代表可乐,和两个杯子,三个容器可以互相倒,问能不能把s平分,能的话输出最小步数,不能就输出NO。思路:BFS,一共有六种情况,s->m(s向m里倒),s->n,m->n,m->s,n->s,n->m。用BFS暴搜,从队列里每取出一个,就用这六种情况扩展一次,并把步数加一,直到搜到终止状态。STL版本:#include#include#define M原创 2012-01-18 01:49:29 · 568 阅读 · 0 评论 -
hdu 1312 bfs
题意:输入个矩阵,@是人所在的位置,人只能左右和上下走,且只能走"."所在的位置,问遍历所有"."需要的步数。思路:暴力BFS,找到一个"."则步数+1。。#includeusing namespace std;struct point{ int x,y;};int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};char map[21][21原创 2012-01-18 01:50:51 · 479 阅读 · 0 评论 -
hdu 1253 三维bfs
题意:人所在位置是(0,0,0),出口在(a-1,b-1,c-1),求到达出口最小步数,并和给出的t做比较,小于等于的时候输出最小步数。思路:和二维BFS差不多。。#includeusing namespace std;struct point//三维的{ int x,y,z; int step;};int dx[6]={1,-1,0,0,0,0};int dy[6]=原创 2012-01-18 01:54:21 · 399 阅读 · 0 评论 -
poj 1011 dfs
题意:输入n,和n根小木棒的长度。已知n根小木棒是由若干根长度相同的原棒分解而来。求原棒可能的最小长度。此题号称是DFS入门的神题,卡了好久,在群里讨论听说这种剪枝是A*剪枝,有时间研究下...http://blog.youkuaiyun.com/xiaofengsheng/article/details/5021579我感觉这个代码比较神,我也是看完他的代码才AC的。其它剪枝就不说了,主要说原创 2012-01-18 01:34:57 · 324 阅读 · 0 评论 -
poj 1190 dfs(生日蛋糕)
这道题说是DFS基础题,但是对我来说还是很纠结,o(︶︿︶)o 唉,还是太水了。。。解题报告思路参考了这个百度空间。http://apps.hi.baidu.com/share/detail/22895781由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号为1的层)开始计原创 2012-01-18 01:39:04 · 387 阅读 · 0 评论 -
hdu 1016 dfs(素数环)
题意:输入一个数n,把1到n的自然数放到一个环里,保证相邻的两个数的和是素数。思路:素数打表+深搜。#includeusing namespace std;int a[20],vis[20],isprime[45]={0},n;void get_prime(){ int i,j; for(i=2;i<8;i++) if(!isprime[i]) for(j原创 2012-01-18 01:42:47 · 3184 阅读 · 0 评论 -
poj 1915 bfs(STL的queue)
题意:给你个棋盘,然后给你初始点和终点,根据规则,求初始点跳到终点的最小步数。。思路:广搜,每扩展一层,步数加一。。用queue写的~~#include#include#define MAX 305using namespace std;struct point{ int x,y; int step;};//到达的点,和需要的步数 int dx[8]={-2,原创 2012-01-18 01:44:59 · 773 阅读 · 0 评论 -
hdu1258/poj1564 dfs
题意:给出数t,然后是n个数,求这n个数中相加之和等于t的所有情况思路:DFS同时并记录其中判重的地方很巧妙。。参考的网上的代码if(a[j]!=a[j-1])意思是如果这个数a[j]和上一个数相同,那么记录数组的同一个位置就没有必要再放入这个数。例如:4 3 3 2构成和是7,tmp数组的第二个位置放了3,则后面的那个3就没有必要再放入记录数组的第二个位置了。(可能会放到后面的位原创 2012-01-18 01:53:03 · 975 阅读 · 1 评论 -
hdu 1241 dfs 类似于(POJ水坑数)
题意:求@的堆数,只要周围没有相邻的@ 那么就算一堆。。思路:DFS,类似于POJ解题报告里的深搜水坑数,不解释。。直接上代码。#includeusing namespace std;int vis[100][100];char map[100][100];int dir[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{原创 2012-01-18 01:56:23 · 495 阅读 · 0 评论 -
hdu 1198 dfs(还是水坑变型题)农田灌溉
题意:已知一些农田的灌溉方式,题中给出m*n大小的农田,求最少设置多少水源,可以把农田全部灌溉。。思路:DFS,跟做过的那个“水坑数”差不多,但是“灌溉方式”和深搜条件不好把握。。int pipe[11][4]={{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,原创 2012-01-18 01:57:35 · 590 阅读 · 0 评论 -
heu 1010 dfs (木棍)
题意:给定整数N代表案例的次数,输入整数M代表木棍数量,然后给出许多木棍的长度,问这些木棍能否拼出个正方形。思路:深搜+简单的剪枝。木棍总长度如果不能被4整除,或者最长的比木棍总长度除以4还要大,那么肯定拼不成正方形。把木棍的长度按降序排列,然后进行深搜。#include#include#includeusing namespace std;int a[25],vis[25原创 2012-01-18 01:11:44 · 427 阅读 · 0 评论 -
poj 2386 dfs(水坑数)
题意:W代表了一个水坑,如果周围没有水坑的话,那么就形成一个大的水坑,最后统计水坑的数量。思路:深搜。周围没有了遍历过的“W”,那么水坑数就加一。#includeusing namespace std;#define max 105int dir[8][2]={{1,-1},{1,0},{1,1},{0,-1},{0,1},{-1,-1},{-1,0},{-1,1}};//八个方向原创 2012-01-18 01:23:19 · 742 阅读 · 0 评论 -
poj 1915 bfs(骑士移动)
题意:给出棋盘上的初始点和终止点,求初始点到达终止点的最小步数。思路:广搜求图上的最短步数,何为最短?就是每走一步都保证是往树的下一层走,那么到达终点的时候需要的步数就是最少的。那么就每走一个点就把下一次可能跳过的所有点的步数都加一,最后输出终止点存的步数即可。#include#includeusing namespace std;int dir[8][2]={{-2,1},{-1,原创 2012-01-18 01:28:52 · 728 阅读 · 0 评论 -
hdu 1010 奇偶剪枝
题意:给一个字符矩阵,S是起点,D是终点,X不能走,其它地方可以走,求T步数的时候是否能从S恰好走到T。。。思路:开始题意理解错了,以为就是个BFS(),WA掉。。。后来看了discuss是dfs()。。TLE掉,后来上网搜,原来得加个“奇偶剪枝”的东西、、、奇偶剪枝:http://www.cnblogs.com/newpanderking/archive/2012/10/09/27169原创 2012-11-13 19:46:21 · 566 阅读 · 0 评论