【递归/搜索】
文章平均质量分 62
张松超
这个作者很懒,什么都没留下…
展开
-
UVA ~ 506 ~ System Dependencies (DFS + 模拟)
题意:软件组件之间可能会有依赖关系,例如,TELNEL和FTP都依赖于TCP/IP。你的任务是模拟安装和卸载软件的组件的过程,首先是一些DEOEND指令,说明软件之间的依赖关系(保证不存在循环依赖),然后是一些INSTALL,REMOVE和LIST指令,如表6-1所示。 DEPEND item1 item2 [item3 ...] iitem1 依赖组...原创 2018-05-22 21:04:13 · 220 阅读 · 0 评论 -
UVA ~ 816 ~ Abbott's Revenge (BFS + 打印路径)
题意:有一个最多包含9*9个交叉点的迷宫。输入起点,离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可)。 这个迷宫的特殊之处在于:进入一个交叉点的方向(用NEWS这四个字母分别表示北东西南,即上右左下)不同,允许出去的方向也不同。例如,1 2 WLF NR ER 表示交叉点(1,2)(上数第1行,左数第2列)有3个路标(字符“”只是结束标志),如果进入该交叉点时的朝向为W(即朝左)...原创 2018-05-14 11:47:43 · 400 阅读 · 0 评论 -
UVA ~ 10562 ~ Undraw the Trees (多叉树 + DFS)
题意:你的任务是将多叉树转化为括号表示法。如图所示,每个结点用除了“-”,“|”和空格的其他字符表示,每个非叶结点的正下方总会有一个“|”字符,然后下方是一排“-”字符,恰好覆盖所有子结点的上方。单独的一行“#”为数据结束标记。输入T组数据,每组数据以"#"结束。思路:按照DFS序打印就好了。如果不是叶子结点就找到最左边的“-”然后DFS子树。注意:该树可能为空,即该组数据只有一个‘#’,此时输出...原创 2018-05-20 11:46:39 · 250 阅读 · 0 评论 -
UVA ~ 1103 ~Ancient Messages (思维 + 图的联通块的应用)
题意:本题的目的是识别3000年前古埃及用到的六种象形文字,如图6-10所示。每组数据包含一个H行W列的字符矩阵(H≤200,W≤50),每个字符为4个相邻像素点的十六进制(例如,10011100对应的字符就是9c)。转化为二进制后1表示黑点,0表示白点。输入满足:□不会出现上述6中符号之外的符号。□输入至少包含一个符号,且每个黑像素都属于一个符号。□每个符号都是一个四连块,并且不同符号不会相互接...原创 2018-05-12 11:48:40 · 233 阅读 · 0 评论 -
UVA ~ 572 ~ Oil Deposits (DFS求联通块)
题意:输入一个m行n列的字符矩阵,统计字符‘@’组成多少个八连块(上,下,左,右,左上,左下,右上,右下)相连算一个块。思路:DFS,八个方向,找到一个‘@’就把跟他相连的块都变为‘*’,然后找下一个@。#include<bits/stdc++.h>using namespace std;const int MAXN = 105;int n, m, dir[8][2] = {{0...原创 2018-05-12 10:20:02 · 205 阅读 · 0 评论 -
UVA ~ 297 ~ Quadtrees (四分树)
题意:如图6-8所示,可以用四分树来表示一个黑白图像,方法是用根结点表示整幅图像,然后把行列个分城两等分,按照图中的方式编号,从左到右对应4个子结点。如果某子结点对应的取余全白或全黑,则直接用一个黑结点或者白结点表示:如果即有黑又有白,则用一个灰结点表示,并且为这个区域递归建树。给出两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数。p表示中间结点,f表示黑色(full),e表示白...原创 2018-05-11 20:54:54 · 346 阅读 · 0 评论 -
UVA ~ 839 ~ Not so Mobile (二叉树的DFS)
题意:输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是W1D1 = W2D2,其中W1和W2分别为左右两边砝码的重量,D1和D2为距离。采用递归方式输入:每个天平的格式为W1,D1,W2,D2,当W1或W2为0时表示该“砝码”实际是一个子天平,接下来绘描述这个子天平,接下来绘描述这个子天平。当W1=W2=0时,会先描述左子天平,然后是右子天平。思路:所有天平都平衡...原创 2018-05-11 11:24:51 · 240 阅读 · 0 评论 -
UVA ~ 699 ~ The Falling Leaves (二叉树的DFS)
题意:给一棵二叉树,每个结点都有一个水平位置:左子结点在它左边一个单位,右子结点在右边1个单位。从左向右输出每个水平位置的所有结点的权值之和。如图6-7所示,从左到右的3个位置的权和分别为7,11,3。按照递归(先序)方式输入,用-1表示空树。思路:开一个数组维护该列的和即可,DFS的过程中边输入边统计。#include<bits/stdc++.h>using namespace s...原创 2018-05-11 15:28:13 · 263 阅读 · 0 评论 -
UVA ~ 12171 ~ Sculpture (离散化 + floodfill)
题意:某雕塑由n(n≤50)个边平行于坐标轴的长方体组成。每个长方体由六个整数x0,y0,z0,x,y,z表示(均为1~500的整数),其中x0为长方体的顶点中x坐标的最小值,x表示长方体在x方向的总长度。其他4个值类似定义。你的任务是统计这个雕像的体积和表面积,注意雕塑内部可能会有密闭的空间,其体积硬计算在总体积中,但从“外部”看不见的面不应计入表面积,雕塑可能会由多个联通块组成。【分析】设想有...原创 2018-05-20 17:31:10 · 494 阅读 · 0 评论 -
UVA ~ 1599 ~ Ideal Path (非简单图 + 逆向BFS)
题意:给一个n个点m条边(2≤n≤100000,1≤m≤200000)的无向图,每条边上都涂有一种颜色。求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小。一对结点间可能有多变,一条边可能连接两个相同的结点。输入保证结点1可以到达结点n。颜色为1~10^9的整数。【分析】首先回顾一下第3章中介绍的“字典序”。对于字符串来说,字典序就是在字典里的顺序。例如,...原创 2018-05-20 21:44:13 · 446 阅读 · 0 评论 -
POJ ~ 3026 ~ Borg Maze (BFS预处理 + 最小生成树)
题意:在一个M行N列的迷宫中(看下样例别弄反了),‘#’表示墙不可以走,其他都可以走,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母A,输出这条路径L的总长度。AC是AC了,但是我依旧没看懂样例是咋来的。。。思路:先把所有A,S点编号,用BFS处理出来A,S中每一个点到剩余所有点的最短路径长度,然后以A,S为点,A到S的最短路径长度为边权建立一个新图,最后对于这个新图...原创 2018-01-24 18:38:11 · 398 阅读 · 0 评论 -
UVALive ~ 6011 ~Error(01BFS + 链式前向星)
题意T组测试数据,每组先输入一个N,表示有N对机场,互相可以买票到达。然后输入一个k,输入k+1个地点,表示现在你已经有k张机票,比如:3 A B C D,表示有三张票A-B,B-C,C-D。你现在要从第一个地点到最后一个地点去(即A-&gt;D),问在换乘次数最小的前提下,最少需要买多少张票。思路票只有两种状态买,不买,明显需要用01BFS。但是我们松弛的条件是优先换乘次数,然后是买票...原创 2018-10-17 17:27:56 · 214 阅读 · 0 评论 -
Gym ~ 100625J ~ Jailbreak (0-1 BFS)
题意有两个犯人要逃出监狱,监狱中有很多门,打开一道门需要花费1的体力,当一个犯人打开门后另一个就不需要在打开了。走到地图外就算逃出监狱了。‘*’表示墙,‘.’表示路(不花体力),‘#’表示门(花费1体力),问两个人都逃出去的最小花费,保证有解。 思路先把地图加一圈‘.’ ,可以把这个问题转化为3个人碰面的问题,两个犯人,一个虚拟的犯人在加的那一圈点的任意一个位置,那么就和C...原创 2018-10-16 20:22:22 · 481 阅读 · 0 评论 -
Codeforces ~ 590C ~ Three States (0-1 BFS)
题意有三个王国要修路使得他们连通起来,'.'表示可以修路的地方,'#'表示不能修路的地方,数字表示该地点是属于哪个国家的路,求使得三个王国连通起来的最小值。 思路求得每个国家到每个地方的最小花费,然后枚举三个国家都连接某个点,求一个最小花费。对于‘.’的位置要 -2,因为这个点只需要被修一次而不是三次,还有就是三个0x3f3f3f3f加起来回超int。#include...原创 2018-10-16 14:38:37 · 382 阅读 · 0 评论 -
UVA ~ 11573 ~ Ocean Currents (0-1 BFS)
题意N*M的地图,每个点有水流方向,如果你在当前点不按照当前点的水流方向走就会花费1的体力,Q次询问,每次询问从(sx,sy)到(ex,ey)的最小花费 思路01BFS,也可以用优先队列,优先队列会慢一点。01BFS(deque):#include <bits/stdc++.h>using namespace std;const int MAXN = 10...原创 2018-10-15 20:48:58 · 273 阅读 · 0 评论 -
SPOJ ~ KATHTHI (0-1 BFS)
题意一个N*M的图,问从(1,1)走到(n,m)最小花费为多少?思路01BFS模板题。01BFS可以解决:边权只有01的最短路,时间复杂度为O(E+V)相对于BFS的不同是:队列为双端队列,每次取队首元素进行更新,如果可以松弛就松弛,如果边权为0放到队首,否则放到队尾。#include <bits/stdc++.h>using namespace std...原创 2018-10-15 19:54:56 · 343 阅读 · 0 评论 -
Codeforces ~ 1063B ~ Labyrinth (0-1 BFS)
题意给你一个N*M的图,起点为(r,c),只能往左走X步,往右走Y步,上下无限制。问可以有多少个点可以到达? 思路第一次听说01BFS。当时写的时候直接BFS,结果PP了,感觉貌似有问题,但是没管,果然就FST了。。。01BFS其实就是把队列开成双端队列,每次花费为1走到的点还是放在后面,花费为0走到的点放在队首。每次取队首元素进行更新。#include <...原创 2018-10-15 17:16:05 · 609 阅读 · 0 评论 -
Codeforces ~ 1006F ~ Xor-Paths(dfs + 中途相遇法)
题意问你从(1,1)到(n,m)异或和为 k 的路径有多少条?只能向右和向下走。 思路我们从(1,1)到(n,m)直接爆搜会超时,我们可以从前往后搜一半记录走到横坐标为x的点的时候路径有多少条,从后往前搜一半,终点a[x][y]会被两条路都统计进去,在^a[x][y]就好了,统计答案即可。#include<bits/stdc++.h>using namespac...原创 2018-07-17 12:20:21 · 587 阅读 · 0 评论 -
CodeForces ~ 999E ~ Reachability from the Capital (思维 + 图的DFS)
题意:n个点(1~n),m条单向边,s为起点,然后输入这m条边。问最少在增加多少条单向边,可以使s可以到达各个点?思路:以dfs所有点,并记录他们的根节点。最终有x个根节点,有两种情况: ①s不为根节点,那么就需要增加x条边。 ②s为一个根节点,那就需要增加x-1条边 注意,可能有环的情况,环的情况我们可以以任意点作为根节点,假设s在某个环中,而我们没以s作为根节点,那么求出...原创 2018-06-24 17:51:46 · 498 阅读 · 0 评论 -
CodeForces ~ 987D ~ Fair (思维 + 多源BFS)
题意:有n(<=1e5)个城市,m(1e5)条边,最多有k(1<=k<=100)个不同类型的物品,你要收集s个不同类型的物品。每个城市会产生一种类型(类型为1~k)的物品,问从每个城市出发收集够s个物品的最小步数。思路:从每个城市进行一遍BFS肯定会超时。因为城市很多,物品类型很少,所以我们反过来考虑,求出来每种物品到达所有城市的最短路径,存起来,跑K次BFS就可以了。对于城市 ...原创 2018-05-31 19:29:54 · 518 阅读 · 0 评论 -
POJ ~ 2083 ~ Fractal (DFS打印图形)
题意:给你一个N,你打印出一个图形,当n=-1时结束,图形规律为n为1时图形为‘X’n>=2时图形为呈如下规律B(n - 1) B(n - 1) B(n - 1)B(n - 1) B(n - 1)思路:我们先开一个二维数组,把所有位置置为空格,然后把该有X的地方置为X就可以了。我们可以发现图形为正方形n=1时,图形大小为1*1n=2时,图形大...原创 2018-05-24 21:13:54 · 303 阅读 · 0 评论 -
CodeForces ~ 987F ~ AND Graph (位运算 + DFS)
题意:给n,m以及m个数字a[i]。0⩽n⩽22,0⩽m,a[i]⩽2n0⩽n⩽22,0⩽m,a[i]⩽2n0 \leqslant n \leqslant 22,0\leqslant m,a[i]\leqslant2^n。思路:如果我们暴力搜索m个数的话,明显会超时,所以我们考虑,如果xy=0xy=0xy=0 ,那么二进制下,假设xxx为10101,那么yyy就为01010(xxx对应位取反)...原创 2018-06-05 16:56:49 · 315 阅读 · 0 评论 -
HDU ~ 1078 ~ FatMouse and Cheese (记忆化搜索)
题意: 有一种游戏是的玩法是这样的: 有一个n*n的格子,每个格子有一个数字。 遵循以下规则: 1. 玩家每次可以由所在格子向上下左右四个方向进行直线移动,每次移动的距离不得超过m 2. 玩家一开始在第一行第一列,并且已经获得该格子的分值 3. 玩家获得每一次移动到的格子的分值 4. 玩家下一次移动到达的格子的分值要比当前玩家所在的格子的分值要大。 5. 游戏所有数字加起来也不大,保...原创 2018-06-11 15:33:36 · 252 阅读 · 0 评论 -
UVA ~ 11853 ~ Paintball (DFS,对偶图)
题意: 有个1000*1000的正方形战场,战场西南角的坐标为(0,0),西北角的坐标为(0,1000)。战场上有n(0≤n≤1000)个敌人,第i个敌人的坐标为(xi,yi),攻击范围ri。为了避开敌人的攻击,在任意时刻,你与每个敌人的距离都必须严格大于它的攻击范围。你的任务是从战场的西边(x=0的某个点)进入,东边(x=1000的某个点)离开。如果有多个位置可以进出,你应当求出最靠北的位置。输...原创 2018-05-23 17:17:08 · 402 阅读 · 0 评论 -
POJ ~ 1941 ~ The Sierpinski Fractal (DFS打印图形)
题意:给你一个N,对应的N阶图形,n=0时结束。思路:我们先开一个二维数组,把所有位置置为空格,然后把该有字符的地方置为字符就可以了。我们可以发现图形为矩形n=1时,图形大小为2*4n=2时,图形大小为4*8n=3时,图形大小为8*16n=n时,图形大小为(2*2^(n-1))*(4*2^(n-1))==(2^n)*(2^(n+1))我们进行递归打印,明显n=1的时候为递归结束条件,此时把2*4的...原创 2018-05-25 15:14:55 · 414 阅读 · 0 评论 -
POJ ~ 2110 ~ Mountain Walking (二分+枚举+BFS)
题意:输入N,给你一个N*N的海拔地图,让你找一条从左上角到右下角的路。要求该条路上的最高海拔 - 最低海拔值最小,输出这个值。思路:暴力DFS搜索所有路,路上维护最高和最低海拔,求一个最小值就是答案,但是时间复杂度太高。我们可以考虑二分求一个这个差值,然后判断看能否找到一条左上角到右下角的路,但是这样只能用DFS,只有这个差的话DFS还是会超时。我们有了这个差值,我们在枚举最小海拔,然后在这个区...原创 2018-04-09 16:05:49 · 394 阅读 · 0 评论 -
POJ ~ 1573 ~ Robot Motion (模拟)
题意:输入N,M,S。表示有一个n*m的地图,机器人从第1行的第S位置进入,每个格子中会有一个指令方向,机器人会按照指令走一格。如果机器人走出地图输出:“%d step(s) to exit”,如果机器人陷入一个循环输出:“%d step(s) before a loop of %d step(s)”表示第几步开始陷入了这个循环和这个循环的大小。思路:直接模拟就行了,搜索写也可以。开一个标记数组表...原创 2018-04-08 20:53:16 · 227 阅读 · 0 评论 -
UVA ~ 624 ~ CD (DFS+剪枝)
题意:给你一个数字N,然后给你k,后面有k个数字,要用这k个数字凑出来最接近N但是不超过N的数字。思路:我们直接搜索,传两个参数,一当前累加和,二当前选到了哪个数字。外面开一个标记数组,标记该数字有没有被选过。全局维护一个最大值MAX,当MAX被更新时,我们把此时选择的数字存到ans数组里面。为什么要传当前选到了哪个数字呢,这是一个剪枝,没有该剪枝会超时。当我们选到第二个数字的时候没必要再往前挑选...原创 2018-04-07 14:29:59 · 189 阅读 · 0 评论 -
NYOJ ~ 92 ~ 图像有效区域(BFS+预处理)
思路:BFS。我们可以在这个图外围加一圈非0的数字,然后从这个地图左上角求一个非0的连通块即可。很巧妙的方法。#includeusing namespace std;const int MAXN = 1500;struct node{ int x,y;}NOW,NEXT;int W,H,MAP[MAXN][MAXN],dir[4][2] = {{1,0},{0,1},{-1,原创 2017-12-17 17:08:00 · 354 阅读 · 0 评论 -
POJ ~ 1011 ~ Sticks(DFS+剪枝)
题意:乔治取了一些长度相同的木棍,他把这些木棍进行了随机切割。他忘了原来的木棍的长度,让你帮他计算这些木棍的最小的可能的原始长度。思路:DFS。从最小的木棍长度尝试每一个可能长度,对于每一个可能的值进行深搜如果哪一个能够成功就是答案。dfs怎么写呢。①我们应该先确定这样一个道理:越短的木棍的灵活度越大,越长的木棍的灵活度越差。所以我们对木棍排个序然后依次从最长的木棍到最短的木棍进行组合,用原创 2017-12-17 19:17:07 · 348 阅读 · 0 评论 -
POJ ~ 2251 ~ Dungeon Master (3维BFS)
题意:给你一个三维的迷宫,可走六个方向(前后左右和上下),问你能否从S走到E。如果能走到按格式输出一个最小时间,走不到输出“Trapped!”。思路:BFS。多加一维状态就好了。#include#include#includeusing namespace std;#define maxn 100struct node{ int x, y, z, step;};原创 2017-12-17 20:13:07 · 325 阅读 · 0 评论 -
NYOJ ~ 488 ~ 素数环 (DFS+剪枝)
思路:DFS。因为是一个环1 4 3 2 5 6和4 3 2 5 6 1是一样得所以我们把第一个数设置为1就可以避免重复。dfs得时候传一个还需要选几个数字,如果能选够k个数字,就输出答案。这个数字被选过就标记一下,用完取消标记。注意有一个剪枝,就是奇数个数字一定不能组成素数环此时直接输出-1。因为如要组成素数环必须要一奇一偶才可以,而奇数个数不能组成这样的环,如1 2 3 4 5,5+1=6原创 2017-12-17 19:51:01 · 608 阅读 · 0 评论 -
NYOJ ~ 722 ~ 数独(DFS+剪枝)
思路:#include using namespace std; int a[10][10],sign; int judge(int n,int x,int y){ for(int i=0;i<9;++i) { if(a[i][y]==n)return 0; if(a[x][i]==n)return 0; }原创 2017-12-17 20:21:55 · 374 阅读 · 0 评论 -
POJ ~ 3087 ~ Shuffle'm Up(set+模拟)
题意:给你两堆牌s1,s2,牌数均为C,按照指定规则互相交叉组合为一堆牌s12,再将s12下面的C张牌归为s1,剩下的为s2。依次循环,问是否能达到制定状态ans。思路:模拟。每次出现过的状态放入set,一直按照规则变化即可,如果某种出现过的状态又出现了那么下面变化肯定都一样形成循环,就不可能有答案。//#include#include#include#include#includ原创 2017-12-25 10:23:09 · 290 阅读 · 0 评论 -
POJ ~ 3279 ~ Fliptile(二进制枚举+模拟递推)
题意:给你一个n*m的黑白棋盘,问能否通过操作使得棋盘全变为白色。如果有求一种操作次数最少的方法(相同时要求字典序最小),没有输出"IMPOSSIBLE"。操作为:将某一块和它上下左右全部翻转。思路:由于我们每次反转都会影响到上面的棋子,我们想全变为白色,我们需要从第二行到第n行每一行把它的上一行的黑色块翻转为白色,如果最后一行把上一行的翻转为白色之后最后一行还有黑色块,证明这种方法不能将棋盘全变...原创 2017-12-23 21:10:52 · 471 阅读 · 0 评论 -
POJ ~ 3414 ~ Pots (BFS+打印路径)
题意:有两个无刻度的容量分别为A,B升的杯子,通过一些操作使某一个杯子中有C升的水。1. FILL(i) ,将i这个杯子中的水接满2. DROP(i),将i这个杯子中的水倒掉3. POUR(i,j),将i这个杯子中的水倒入j这个杯子,能倒完就倒完,倒不完就留在杯子中。问达到目标状态的操作次数最少的方案是什么?思路:BFS+路径输出。共六种操作FILL(1),FILL(2),DR原创 2017-12-25 13:07:21 · 357 阅读 · 0 评论 -
FZU ~ 2150 ~ Fire Game (双点BFS)
题意:你最多可以选择两处火源,要把整个地图上的草地都点燃,火可以往上下左右四个方向扩散,能否把所有的草地都点燃,能的话输出最少时间,不能输出-1;'#'代表草地,'.'表示空地,空地不会起火。思路:10*10的图很小,所以暴力枚举两个起火点然后两个点同时进行广搜。因为不知道终点所以我们需要把走到每一个点的时间都存下来,然后遍历一下,那么草地那些点中起火时间最晚的那个点,也就是当前枚举这两个起火原创 2017-12-25 19:13:11 · 305 阅读 · 0 评论 -
HDU ~ 2612 ~ Find a way (预处理+BFS)
题意:Y,M两个人要去KFC一起吃个饭,'@'表示KFC。问Y,M每走一步花费11的体力,他俩花费最少的体力为多少?KFC有多个,保证至少有一个KFC是他俩都能到达的。思路:BFS。两个人都跑一遍地图,存一下每个人到每个点的最小步数。然后从是'@'的点的中求一个最小值。注意:要把存步数那个数组赋初值为极大值。赋0会wa。因为可能有一个点他俩都到不了,赋0的话最小步数会求一个得0。#in原创 2017-12-25 20:14:24 · 322 阅读 · 0 评论 -
POJ ~ 3984 ~ 迷宫问题 (BFS+打印路径)
题意:输入一个5*5的迷宫地图,输出一条最短路径。思路:BFS+路径输出。裸的路径输出问题。开一个存路径的结构体,每个点存来的点的坐标,然后递归到起点,回溯输出路径。//#include#include#include#includeusing namespace std;int n, m, MAP[15][15], dir[4][2] = {{1, 0}, {0, 1}, {0原创 2017-12-26 09:51:43 · 456 阅读 · 0 评论 -
HDU ~ 1495 ~ 非常可乐(BFS)
思路:bfs。倒水共有6中情况既(A->B,A->C),(B->A,B->C),(C->A,C->B),我们可以写一个双重循环来模拟这六种情况(当然你也可以把这六种情况一一写出来)。当 i -> j,i给j倒水的时候有两种情况,① i 可以把 j 给装满 ② i 装不满 j 。两种情况不一样记得判断一下即可。标记数组开为3维,每一个维度表示一个杯子。注意:结束条件为严格的有两个杯子中有S/原创 2017-12-26 10:44:18 · 383 阅读 · 0 评论