搜索
文章平均质量分 76
AC_Gibson
这个作者很懒,什么都没留下…
展开
-
HDU1312 Red and Black DFS
题目大意:有一个矩形的地板涂有红,黑两种颜色,一次只能向上下左右移动一步且只能移动到相邻的黑色地板,问一共可以走多少块黑色地板。典型的搜索题,下面是深搜的代码:#include #include using namespace std;int w,h;char map[25][25];int dfs(int i,int j){ if(ih||j=w) r原创 2014-12-29 17:27:57 · 506 阅读 · 0 评论 -
HDU1372 Knight Moves BFS
题目大意:在一张8×8的国际象棋棋盘上(其中纵坐标用a-h表示,横坐标用1-8表示),给你一枚骑士的起点坐标和要到达的终点坐标,让你求出骑士要走的最小步数。分析:其实这道题的难点就在于很多人并不知道骑士是怎么移动的,其实国际象棋中的其实相当于中国象棋中的马,他的移动轨迹的“日”字形的,只是少了中国象棋中的“蹩马腿”这一说。知道了这一点,这道题就简单多了,很水的一道BFS题目。实现代码如下:原创 2015-03-13 16:43:47 · 546 阅读 · 0 评论 -
POJ1129 Channel Allocation DFS
题目大意:广播电台广播时为了让听众接收到一个比较稳定的新号,一般都会有若干个中继器来重发新号,以此达到增强新号的目的(每一个中继器用一个大写的英文字母表示)。已知每个中继器都需要一个频带,而且当两个中继器相邻时,他们所使用的频带就不能是相同的了,否则他们会相互干扰彼此的信号传播。现在,给你广播电台中继器之间相邻关系的网络,让你判断出最少需要使用多少不同的频带。分析:广播电台中继原创 2015-04-17 15:35:27 · 606 阅读 · 0 评论 -
POJ3009 Curling 2.0 DFS
题目大意:定义了一种新规则的冰球游戏,在一个w×h的场地移动冰球,场地内有障碍物,冰球从起点到终点的移动方式如下:(1)冰球可以向上下左右中的任意方向移动;(2)冰球一旦开始移动,就不会停下来除非: (a)冰球到达终点; (b)冰球碰到了障碍物;(3)冰球碰到障碍物时,冰球会停在障碍物面前,同时障碍物消失。(4)游戏结束,当且仅当:原创 2015-04-13 21:51:01 · 484 阅读 · 0 评论 -
POJ1426 Find The Multiple BFS
题目大意:给你一个十进制整数n,让你找出n的十进制倍数m,使m满足每位上的数字只能是0或1。如果存在多个,那么就任意输出一个。分析:m和n的范围不太大,首先想到的就是暴力=_=!暴力过程中发现需要同时记录两个结果:当前数cnt乘10之后加0和加1,因为要分别在这两种情况之后考虑后面的情况,后面类推也是如此,感觉像是一层一层的往外搜索---BFS。实现代码如下:#in原创 2015-04-14 16:24:19 · 492 阅读 · 0 评论 -
POJ3278 Catch That Cow BFS
题目大意:FJ发现了一只逃亡的奶牛想要把它抓回来,已知FJ在N点,奶牛在同一水平线上的K点,FJ可以在一个时间单位内向左或向右移动一步,也可以有x点移动到2x点。现在问你FJ要抓回奶牛最少需要多少时间。分析:要搜索最少时间,果断BFS,把方向数组换成X+1,X-1,X*2就行了。实现代码如下:#include #include #include #include原创 2015-04-14 12:12:39 · 513 阅读 · 0 评论 -
POJ3126 Prime Path 四维BFS
题目大意:给你两个4位素数A和B,让你把A经过若干次修改后变为B,每次修改只能修改A中的一个数字且修改后的数要仍为素数,且修改的过程中不能出现重复的素数。问你素数A变为素数B最少需要经过几次修改。如果不存在一系列的修改使A变为B,输出Impossible。分析:四维BFS。我们把每一个数子对应为一个四维数组,那么问题就变为了在一个四维空间中,由起始点(素数A)到终点(素数B)的最短距离原创 2015-04-14 19:04:32 · 806 阅读 · 0 评论 -
POJ2531 Network Saboteur DFS 或 无向图的最大割
题目大意:给你一个无向完全图,让你求出该图最大割。分析:裸的最大割问题,随机算法就行,卡好时间。实现代码如下:#include #include #include using namespace std;int maze[25][25];int main(){ int n; while(scanf("%d",&n)!=-1) {原创 2015-04-15 19:39:04 · 1134 阅读 · 0 评论 -
POJ3026 Borg Maze BFS+Prime
题目大意:给出一个m×n的迷宫,迷宫中有若干(小于100)个外星人,现在Borg要同化这些外星人,Borg可以向上下左右移动,但不能碰撞到墙(即题中的“#”)。已知外星人(用“A”表示)和Borg(用“S”表示)所在位置的坐标,问你要同化所有外星人所需要的最短路线是多少。定义两点之间的距离为这两点纵坐标之差的绝对值加上这两点横坐标之差的绝对值。另外Borg可以同时向不同方向移动,此时他走的路程也是原创 2015-04-07 11:49:00 · 550 阅读 · 0 评论 -
POJ3414 Pots BFS
题目大意:给出两个容量分别为V1,V2的瓶子,和目标水量C,瓶子可以进行如下3种操作:(1)FILL( i ):将第i个瓶子装满水(i=1,2);(2)DROP( i ):将第i个瓶子里的水全部到出(i=1,2);(3)POUR( i,j):将第i个瓶子的水倒入第j个瓶子中(或将i中的水全部倒入j中,或将i中的一部分水倒入j中的时候j已经装满)。现在问你经过多少次操作能使其中一个瓶原创 2015-04-15 14:18:19 · 459 阅读 · 0 评论 -
POJ2676 Sudoku DFS
题目大意:将数独补充完整。给你一个不完整的9×9的数表,让你补充完整,使完整的数表中每一行,每一列,和每一个小的3×3的数表中是数字分别互不相同。分析:枚举每一个空点,在该点填入一个数的基础上重复这步操作,直到数独补充完整。DFS思想。实现代码如下:#include #include #include using namespace std;int map[原创 2015-04-16 17:42:55 · 507 阅读 · 0 评论 -
POJ2230 Watchcow 欧拉回路路径
题目链接:http://poj.org/problem?id=2230题目大意:相当于给出一个有向图,求出一条欧拉回路,并输出路径。分析:题中说是每条路都正反走两边,其实就是相当于就是连接两个顶点的一个双向路径,每个方向的路径都走一遍。实现代码如下:#include #include using namespace std;const int M=50原创 2015-08-19 17:22:35 · 479 阅读 · 0 评论 -
POJ2337 Catenyms 欧拉路径
题目链接:http://poj.org/problem?id=2337题目大意:给出n个单词,找出他们之间一条字典序最小的连接路径。两个单词能连接当且仅当前一个单词的尾字母等于后一个单词的首字母。分析:单词接龙,POJ1386的升级,需要输出路径。我们可以先把这些单词排序,然后在进行建图,这样我们在dfs的时候就等于直接按字典序来搜索了。实现代码如下:#in原创 2015-08-21 11:03:55 · 417 阅读 · 0 评论 -
HDU1253 胜利大逃亡 三维BFS
本题大意就是让你求出一个三维迷宫的最少步数解,如果迷宫不通,输出-1分析:由于是让找出最小步数,BFS更好些(BFS是逐层往外搜索的,当前解即为最优解),只需把方向数组改一下就行了,总体来说和二维BFS没太大差别。实现代码如下:#include #include #include using namespace std;int dir[6][3]={{1,0,0},{0,1,0原创 2015-03-13 16:09:16 · 617 阅读 · 0 评论 -
HDU1258 POJ1564 Sum It Up DFS
题目大意:输入两个整数t和n,然后输入n个整数,让你找出这n个整数中,和为t所有的算式。#include #include using namespace std;int n,t;int num[15],ans[15];bool flag;void dfs(int sum,int x,int cnt){ if(sum==t) { flag=true原创 2015-03-12 12:54:05 · 507 阅读 · 0 评论 -
BFS:中国象棋中的跳马问题
问题描述是这样的:有一张p*q的棋盘,并且棋盘中有障碍物(用来限制马的行动,即中国象棋中的蹩马腿)。有一个棋子马(走“日”字形路线),要从起始点走到终点。输入部分:第一行输入一个整数n,表示有n组测试实例,每组测试数据第一行输入两个整数p和q,表示棋盘的大小(1输出部分:输出马从起始位置走到终点所需的最小步数。若马不能走到终点,输出“ can not reach原创 2015-03-12 20:54:08 · 3042 阅读 · 0 评论 -
POJ1753 Flip Game DFS+枚举
题目大意:有一个4×4的棋盘,棋盘上每一点都有黑白两面,每次可以翻转任意一点,在翻转某一点时,该点上下左右的4个临近点同时也会被翻转,现在问你要使棋盘上所有点的颜色统一所需要的最小翻转次数。分析:其实这道题是典型的高斯消元,不过我是用DFS来做的。首先我们知道,对于棋盘上任意一点,翻转偶数次是没有意义的,翻转奇数次和翻转一次是一样的,这就意味着,最大的翻转次数也不会超过4×4=16次,这样原创 2015-03-16 19:23:55 · 988 阅读 · 0 评论 -
POJ3083 Children of the Candy Corn BFS+DFS
题目大意:给出一个n*m的迷宫和起点S以及终点E,让你找出一下三种迷宫求解结果:(1)左转优先搜索;(2)右转优先搜索;(3)迷宫最短路线;分析:前两者可以借助DFS来完成,对于最短路线,就只能用BFS了。我们首先来考虑一下怎么实现左转优先,对于下图来说,最初的方向由起点S确定,而下一步的方向则由前一步的方向决定。例如 左边优先搜索:当前位置的方向指向 1(向左),(这同时说明原创 2015-03-16 21:47:11 · 438 阅读 · 0 评论 -
POJ3411 Paid Roads DFS
题目大意:有n个城市和m条道路(城市编号为1到n),从a城市经过c城市到达b城市(这里的a和c可以是同一个城市)的过路费有两种:(1)如果c城市已经走过,那么路费为p;(2)c城市没有走到过时路费为r;现在给出m条道路的信息,让你求出从城市1到城市n所需的最少路费。分析:乍一看这倒题像是图论中的最短路问题,可是仔细想想并不是那回事。题中并没有说哪两个城市之间可达,只是说了从a城市经过c城市到达原创 2015-03-17 12:29:29 · 628 阅读 · 0 评论 -
POJ2488 A Knight's Journey DFS
题目大意:一个p×q的棋盘,问你一个骑士(走法相当于中国象棋中的马)能否遍历棋盘上的每一点?如果可以,输出字典序最小的一组路径,否则输出“impossible”。分析:典型的骑士周游问题,直接DFS就行,注意一下方向数组的定义就行,因为要按字典序输出路径,我们可以按字典序遍历,这样,第一次成功的遍历就是答案了。实现代码如下:#include #include #include u原创 2015-03-17 20:46:29 · 549 阅读 · 0 评论 -
POJ2965 The Pilots Brothers' refrigerator(枚举+思维题)
题目大意:给出一个4×4的矩形,矩形上的“ + ”表示关闭状态,“ - ”表示打开状态,可以改变任意一点(i,j)的状态,改变该点状态的同时,第i行和第j列上的元素的状态也随之改变,问你事所有点都变成打开状态所需的最少翻转次数,同时输出要改变状态的点的坐标(坐标从1开始)。分析:这题和POJ1753有点相似,但比1753更有思维性。首先我们先来看一下,对于矩形中的某点(i,j),如果我们改变这原创 2015-03-17 18:39:02 · 523 阅读 · 0 评论 -
POJ1088 滑雪 DP+记忆化搜索
#include #include #include using namespace std;int map[105][105];int dp[105][105];int num,c,r;int bfs(int x,int y){ if(dp[x][y]) return dp[x][y]; int nmax=1; int len; if(x+1map原创 2015-03-10 13:14:48 · 567 阅读 · 0 评论 -
HDU1241 Oil Deposits DFS
题目大意:有一块油田,@表示改点为原油,*表示空地,每相邻的原油点(即上,下,左,右,斜边共8个方向相邻任意一方向相邻都可),他们的品种是一样的,现在问你该油田共有多少种不同的原油品种。分析:枚举每一个坐标点,如果该点为原油,计数器++,同时以该点为起点进行深搜,标记和该点相连的原油点为*。这样,枚举完每一个点之后,我们也就找到了不同的原油品种的数目了。裸DFS就行,下面是我的代码:#原创 2015-03-11 15:19:16 · 437 阅读 · 0 评论 -
HDU1010 Tempter of the Bone DFS+剪枝
题目大意:一条狗因为一根骨头陷入了迷宫中,time=0时刻狗在迷宫的入口S处,狗每一次只能移动到上,下,左,右中临近的有效格中(即题目中的 " . ")且只能呆1秒的时间(真是太为难这只可怜的doggie了),走过的路在下一秒塌陷(即不能重复走路),问你这条狗能否在第T秒(time=T时)恰好走到迷宫的出口D处。很显然这道题是搜索题,但提交时就会发现问题来了,直接DFS果断TLE了。其实这原创 2015-03-11 13:29:26 · 437 阅读 · 0 评论 -
HDU1242 Rescue BFS+优先队列
题目大意:一个天使被困在了迷宫中的监狱,迷宫中有警卫看守,天使的朋友想去监狱中营救天使,每走一步花费一个时间单位,击杀警卫额外花费一个时间单位(即有警卫的地方是可行的,只有围墙不能通过),问你营救天使最少需要花费的时间。分析:由于可能有多个救援人员,所以我们可以从天使所在地为迷宫入口向外开始搜索,当遇到第一个营救人员时,这之间花费的最少时间即为最终答案。BFS即可,考虑到有时间差别,故用了原创 2015-03-11 17:47:49 · 593 阅读 · 0 评论 -
POJ1321 棋盘问题 DFS
#include #include #include using namespace std;int map[10][10];bool s[10];int num,n,k;void dfs(int r,int t){ if(t==k) { num++; return ; } if(r>n) return ; f原创 2015-03-10 20:39:54 · 458 阅读 · 0 评论 -
图的遍历:BFS和DFS
先来看图的深度优先遍历: 深度优先遍历的基本思想是访问顶点V0,然后访问V0邻接到的未被访问的顶点V1,再从V1出发递归地按照深度优先的方式遍历。当遇到一个所有邻接于它的顶点都被访问过了的顶点u时,则回到自己访问顶点序列中最后一个拥有未被访问相邻顶点的顶点w,从w出发继续访问。最终当任何已被访问过的顶点都没有未被访问的相邻顶点时,遍历结束。也就是说,深度优先遍历是沿着图的某一条分原创 2015-03-10 15:37:40 · 663 阅读 · 0 评论 -
DFS:多米诺骨牌游戏
问题描述:多米诺骨牌的游戏规则是这样的:推倒一张骨牌,由于连锁反应和它有关的多米诺骨牌都会相应倒下。谁推倒的骨牌数量多,谁就是赢家。但今天我们把规则改变一下,我们引入一张特殊的骨牌“の”,最后推倒的骨牌是这张牌的人为赢家。输入部分:每组测试先给出2个正整数n,m(2骨牌(西红柿也是一种多米诺骨牌)。接着有n行,每行有m个整数。每个单元里的整数grid[i][j]表示的是推倒原创 2015-03-12 21:29:59 · 1840 阅读 · 0 评论 -
POJ1655 Balancing Act 求树的重心
题目链接:http://poj.org/problem?id=1655题目大意:树的重心:找到一个点作为新的树根,其所有的子树中最大子树的节点数最少,那么这个点就是这个树的重心。树的重心的意义在于,删去重心后,生成的多棵树尽可能平衡。分析:一次搜索即可。DFS每一个点s,找出其各个子树的节点数,纪录最大值son[s],然后比较balance=max(son[s],n-son原创 2015-10-22 10:59:43 · 464 阅读 · 0 评论