BFS/DFS搜索or暴力模拟
Anxdada
多读书多看报, 少吃零食多睡觉
展开
-
HDU 5094 Maze 【bfs + 状态压缩】
传送门 这道题就是HDU 1429 的加强版而已, 做过HDU1429的做这道题应该就会更有思路的多.// 题意: 给定一个n*m的矩阵, 问从(1, 1)走到(n, m) 的最少步数是多少, 不过在某些点到某些点它可能有墙或者门, 墙不能被通过, 门的话必须要有相应的钥匙才行. // 思路: 门只有10种, 很明显的处理方法就是很HDU1429一样, 用一个数的二进制位上时候有1来表示是否拥有原创 2018-01-22 23:13:28 · 327 阅读 · 0 评论 -
HDU 5092 Seam Carving 【BFS搜索】
传送门 // 题意: 给定一个n*m的矩阵, 每一个点可以从它的正下方 , 右下方以及左下方, 问找到一条从上到小的一条线路使得这条线路上经过的权值和最小. 如果有多条线路那么输出列标中字典序更大的那条. 即打印每一行选择的那一列的列标.// 思路: 我用的BFS, 因为这种一看什么最小就是BFS呀(笑哭), 听说正解是DP?反正他们都用的DP. 我们首先把每个点都推进队列, 从第一行的每一个原创 2018-01-22 23:23:06 · 359 阅读 · 0 评论 -
HDU 4571 Travel in time 【最短路 + dfs记忆化||dp】好题!!!
传送门 // 题意: 给定一幅无向图(n, m), 每个点有个时间花和价值, 任意点之间也有路径花费, 你经过的每一个点你可以选择访问它, 消耗该点的时间花费, 然后得到它的价值. 给定起点和终点(必须经过但是可以不访问), 问可以得到的最大的价值是多少.// 思路: 很明显的每一个点我们可以选择访问或者不访问, 那么就是01背包问题, 也就是dp, 我用的dfs来实现的该dp过程. 但是一定要记原创 2018-01-30 23:10:03 · 320 阅读 · 0 评论 -
玲珑杯 Round 24 C 题 【思维好题!!! + bitset标记状态】
传送门 // 题意: 给你一个无向图,每次查询的时候给一堆二元组(xi,yi) 求图中有多少个点u与至少一个这次询问给出的二元组(xi,yi)满足dist(u,xi)<=yi,dist表示这两个点在图中的距离 如果不连通dist = inf// 思路: 我们考虑用压位进行优化, f[i][j] 表示的是这幅图中到达i点的距离 <= j 的所有点构成的bitset集合, 然后查询的时候就是把一堆原创 2018-01-23 19:53:12 · 365 阅读 · 0 评论 -
HDU -- 5071 Chat 超强模拟
链接 熟悉map和vector的操作, 特别是map的,vector只是充当一个队列的储存. //map.count(k); 算出map中有多少个k, 其中k为map的key值. //一个find Vector的例子(BAIDU里找的),注意find不属于vector的成员,而存在于算法中,应加上头文件#include :#include #include #include u原创 2017-07-20 01:00:07 · 388 阅读 · 0 评论 -
ZSTUOJ 4191 无向图找环 【dfs找环】
传送门 // 题意: 给定一副带权无向图, 问其中是否有异或值大于零的环存在. // 思路: 直接dfs一遍找环就是了, 用sumxor[x] 表示到达这个点时的边权亦或和, 那么对于我们的起始点当然就是sumxor[st] = 0, 然后如何表示环上面的路径亦或和了, 假设是7 8 1 2 3 4 1, 从4返回1的时候如何表示1-4的环上亦或和了, 那就是sumxor[4] ^ sum原创 2018-01-16 16:34:59 · 755 阅读 · 0 评论 -
HDU 2782 The Worm Turns 【dfs深搜】
传送门 // 题意: 给定一个n*m的矩阵, 有些地方上有石头不能通过, 蠕虫移动的规则是一旦确定了方向, 那么它会向这个方向一直移动, 直到遇到了石头或者墙或者自己曾经吃过的地方, 才能换方向. 问从哪为起点可以经过尽量多的空地, 如果有多解那么输出字典序小的坐标为地点, 并且方向也是以E, N, S, W为优先级. // 思路: 这道题最好的做法就是dfs, 看一下时限, 发现能试着搜, 所以原创 2018-02-02 00:10:51 · 343 阅读 · 0 评论 -
HDU 1142 A Walk Through the Forest【最短路 + dfs记忆化搜索】
传送门 // 题意: 首先给定一幅无向图(n, m), 起点是1, 终点是2, 图中两点A, B能相互到达的条件是A到终点的距离比B到终点的距离要长. 问1到2有多少种方式.// 思路: 先求出2到所有点的最短路, 然后深搜答案, dfs的过程中保存每个点的信息, 如果再次遇到某个点时他已经有路径条数的信息, 则可以直接放回答案了. AC Codeconst int maxn =原创 2018-02-02 01:01:15 · 348 阅读 · 0 评论 -
Gym-100935G Board Game 【dfs】
// 题意: 一个4*4的格子上少了9个数字, 要用功1-16中在原先格子上没有出现的数字进行添, 要求每一行以及每一列相加是一个定值, 最后输出字典序小的那个方案.// 思路: 定值肯定就是34了, 然后这种题一看就是dfs出所有解取最优的那个, 因为字典序要最小, 首先我们要从小到大枚举, 其次是每一个要添的数字我们要判断是否满足34这个条件, 然后dfs出结果就行啦.AC Codeint an原创 2018-01-26 10:21:28 · 326 阅读 · 0 评论 -
POJ 2271 HTML 【模拟题】
传送门 // 按照题意模拟就是了.说几个坑点. 1: 每一行的末尾不能有空格 2: hr之前的换行要特别注意什么情况, 比如开头就是hr 不换行等. 3: 每次输出word时注意长度大于80了, 算长度是注意加上空格的长度. 4: 最后还要出一个空行.像这类模拟题, 用string是最方便的, 即读一个输出一个. 记住了!!!AC Codestring hr = "-----------原创 2018-01-26 10:25:50 · 317 阅读 · 0 评论 -
UVA 11624 Fire! 【经典bfs】
传送门 // 题意: 在迷宫里有几处地方着火了, 火势每秒向上下左右扩散, 然后有一个J的人在迷宫里, 问能否跑出迷宫(只要他到达了边界就算出迷宫了). 注意 火 与 人 都不能穿墙思路: 我们做两次bfs, 第一次把所有的着火点进行bfs, 处理出每一个火可以蔓延到的地方的着火时间, 然后再对人进行一次bfs, 除了一些判断条件外再加上判断人到这个点的时间与着火事件比较一下, 如果到达的时...原创 2018-02-26 21:30:28 · 298 阅读 · 0 评论 -
POJ 3009 Curling 2.0 【dfs 而不是 bfs】
传送门 // 题意: 一个矩阵, 从2到3, 1是墙, 每次将这个冰壶往一个方向扔出去, 这个冰壶是有在碰到了石头才会停下来, 并且被撞的石头消失, 或者冰壶出界. 问最多扔10次问到达终点的最少扔的次数是多少..思路: 这个很多人一眼看最短, bfs没跑了, 但是我们要注意这个图是会发生改变的, bfs同时的多个状态进行会影响图的, 从而影响答案, 所以我们看10次, 图的大小, 因为用深...原创 2018-02-26 21:48:21 · 305 阅读 · 1 评论 -
POJ 2488 A Knight's Journey 【dfs + 思维】
传送门 // 题意: 给定一个n*m的棋盘, 问是否有一种方式可以使这匹马走遍这个棋盘的每一个点, 有的话打印出路径, 并且字典序要尽可能的小.思路: 可能难点的地方就是字典序那, 其实不用管, 因为如果我们从除(1, 1)的点走完全程, 那为啥不从(1, 1)出发这个再是字典序最小的呀, 所以我们直接从(1, 1)开始搜就OK啦, 然后因为字典序的原因8个方向有一定的顺序, 然后只要能搜出...原创 2018-02-26 23:19:00 · 215 阅读 · 0 评论 -
POJ 3026 Borg Maze 【思维 + bfs + MST】
传送门 // 题意: 这个题意确实有点难懂, 就是起始点是S, A是外星人, 然后问从S出发把所有A吃完至少需要多长时间, 规则是从起始点就可以分成很多份(任意份), 但是总的步数是所有份一起走的步数, 然后吃了一个A后又可以分成很多份. 所以第一个样例是起始点就分两份走, 样例二是起始分成2分, 然后再吃完(2, 3), (6, 3) 后又分两份即可.思路: 所以我们可以发现任意一点A是可以由A原创 2018-03-02 18:35:58 · 204 阅读 · 0 评论 -
codeforces 877 problem D Olya and Energy Drinks 【bfs剪枝】
传送门 //题意: 就是给定一个起点和一个终点, 每次可以往四个方向最多走k步, 每次走花费一秒, 问走到终点最少需要多少秒. //思路: 直接bfs肯定会T, 我们需要加上几个剪枝, 一个是当我们走到某点时, 该点曾经被到达过,并且此时的时间比从当前点走到这个点的时间还要短, 那么就不要走了, 因为后续的点由这个点到达更优一点. 具体细节请看代码.AC Codeconst int maxn原创 2017-11-06 15:18:28 · 364 阅读 · 0 评论 -
九度 1363 欢乐打扑克 【简单水题暴力模拟】
传送门 //中文题面就不说了. 直接暴力判断, 遇到1,2加个13就是了, 然后注意两幅牌都要加, 然后输出答案时再减个13就是了. const int maxn = 1e2+5;int cas=1;int a[maxn],b[maxn];void solve(){ int n; while(~scanf("%d",&n)){ Fill(a,0);原创 2017-10-07 13:17:03 · 1053 阅读 · 0 评论 -
百练 4124 【状态压缩 + 记忆化搜索】
传送门 //题意就不说了. //题目要求是一定是从标号1出发, 最后到达标号n, 中间不重复的经过完其他岛. 那么问题就是如何搜索. 中间有14个点, 那么最坏的情况就是14!中情况, 这样肯定是会超时的. 所以我们需要剪枝, 因为我们可以发现中途到达某个点时, 如果此时的深度大于了曾经经过的点的深度或者目标点的深度, 那么直接没有搜索下去的必要. 所以我们需要记忆化搜索. 还有一个问题原创 2017-08-10 20:25:56 · 529 阅读 · 0 评论 -
HDU -1495 非常可乐 【 BFS 】
传送门 // 题意: 有一个体积为s的瓶子, 有两个体积为n, m的杯子, 问是否有可能将s体积的水平分成在两个容器中各s/2. 有的话输出最少要倒的次数,思路 : 每一次倒水有六种方法,即(s->a ; s->b ; a->s ; a->b ; b->s ; b->a),我们要得到最少的倒的次数,当然就是用bfs咯. 每次将六中操作一一模拟入队即可…...原创 2017-06-22 17:05:59 · 363 阅读 · 0 评论 -
POJ - 3414 Pots 【BFS + 保存(打印)路径 】
传送门 // 题意: 给定两个体积的杯子, 有如题的三种操作, 问能否倒出来给定的一个体积水. 输出最少的步骤和具体的操作步骤.// 思路: 这道题的难点在于操作路径, 不能用记录前驱的方法来解决, 因为同一个步骤可能会有多个相同的前驱, 也就是不好操作. 那么最好的方法就是把到这一步之前的步全部保存下来, 然后一一输出即可. 然后其他的步骤和非常可乐很像啦, 直接bfs搜搜即可….AC...原创 2017-06-22 17:06:20 · 386 阅读 · 0 评论 -
UVA - 11624 Fire! 【双BFS + 思维】
题意: 迷宫里有多处起火点, 里面有一个人, 人和火都不能传过墙, 问人能否在火烧到那个人之前逃出迷宫, 如果能输出最少步骤, 否则输出IMPOSSIBLE.思路 : 进行双BFS, 同时搜索人和火, 并单独判断条件就可以了. #include<cstdio>#include<cmath>#include<algorithm>#include<iostream>#include<cstri原创 2017-06-22 17:14:17 · 343 阅读 · 0 评论 -
OpenJ_Bailian - 2787 算24 【思维 + dfs】
传送门思路 : 因为要问是否可以算出, 所以需要把所有可能性都列出来, 自然就要想到搜素赛.AC Code#include<cstdio>#include<algorithm>#include<cmath>#include<iostream>#include<cstring>#define db double#define CLR(x) memset(x,0,sizeof(x))usi原创 2017-06-22 17:44:26 · 776 阅读 · 0 评论 -
算24 【简单深搜】
/** @Cain*/db a[5]; //存开始的那4个数bool iszero(db x) //浮点数 零的比较.{ return fabs(x) <= eps;}bool dfs(db *a,int n) //从a数组的n个数中算出24.{ if(n == 1) { if(iszero(a[0] - 24)) return true;原创 2017-08-09 22:46:00 · 416 阅读 · 0 评论 -
poj -- 1088 滑雪 【简单深搜】
传送门 //思路 : 本菜鸡的思路是从一个点进行记忆化搜索, 可以走的地方就走. 并判断是否记忆化过, 是的话直接返回当前这个点可以到达的最大深度. dp[i][j] 就是代表从(i,j)这个点可以到达的最大深度. AC Code/** @Cain*/const int maxn=1e2+5;int dp[maxn][maxn],h[maxn][maxn];int n,m;int df原创 2017-08-09 23:47:13 · 482 阅读 · 0 评论 -
百练 4116 拯救行动 【bfs的内涵理解】
传送门 //中文题面就不说了. //提示 : 既然是最短时间, 第一反应肯定是bfs, 但是这道题需要你对bfs的理解要深刻一点. 如果单纯以最短去搜索, 遇到x时间就加2, @就加1, 然后去找. 这样肯定会WA的. 因为这样找只是找到的最短路径下的最短时间, 并不是全局的最短时间, 所以我们不能以路径来扩充下一个节点, 而是应该以时间来扩充下一个节点, 即队列中推出来的是目前到这个点的最短时原创 2017-08-10 09:44:55 · 879 阅读 · 0 评论 -
UVa --- 10795 A Different Task 汉诺塔不一样的操作【递归 + 思维】
传送门 //首先说一个汉诺塔的经典结论. 把i-1个盘子从一个柱子整体移动到另一个柱子, 这是需要2^(i-1)-1步. //题意: 给你两个汉诺塔的状态, 问从第一个状态到第二个状态最少需要多少步. 移动的时候满足汉诺塔的规则. //思路 :原创 2017-08-16 21:34:51 · 468 阅读 · 0 评论 -
HDU --- 1016 素数环 【简单深搜】
传送门 //题意: 给你一个数n, 要求用1-n这些数构成一个环, 且环上任意两个数的和是素数, 问所有的可能性. //思路 : 既然是要考虑到所有性, 当然是选择深搜. 在搜的过程中加一些限制条件就行了. AC Code/** @Cain*/int n;int a[30];bool ispri[30];bool vis[30];void init() //预处理下20以内的素数.原创 2017-08-11 23:31:35 · 908 阅读 · 0 评论 -
HDU -- 6113 度度熊的01世界 【搜联通块 + 思维】
传送门 //题意就是题目中的意思. //大概思路有两种. 第一种直接通过0,1联通快的数量来判定图像. 但是有个问题就是例如这种 3 3 010 111 010 那么如果根据一般的判定条件, 会输出-1, 而实际上是1, 所以我们需要做一点小小的改变. 就是在图的外侧加一圈0, 这样这个例子0,1联通快的数量就又都是1了, 这样就好判断了.AC Code/** @Cain*/int原创 2017-08-13 12:42:05 · 379 阅读 · 0 评论 -
HDU --- 5961 传递 【思维 + bfs】
传送门 //题意: 给你两幅图, 为是否都是竞赛图. 竞赛图的定义题目中给出了的. //思路 : 比赛的时候没开 . 因为比赛想的是暴力, 不敢动. 下来看了下正解, 用bfs, 不可能会出现深度>=2的, 出现了就不是, 否则就是. 只能说想法太好了, 我怎么就想不到了. 太菜了… //注意的就是如何简化代码量, 因为有两幅图, 但是最好只写一个bfs最好, 避免写的丑. 所以要多多学习!原创 2017-08-22 19:27:03 · 409 阅读 · 0 评论 -
HDU - 5962 Counting Cliques 【思维 + dfs 暴力】
传送门 //题意: 给定一幅n个点, m条边的图, 问有多少个恰好有S个顶点的完全子图? //思路: 这道题的想法炒鸡棒, 要学到. 因为s最大10. 点数最多也才100. 完全可以用暴力搜索. 问题有一点, 如何避免搜重? 所以这里就非常有意思了. 我们建图时建有向的有序边. 即我们只从编号小的到编号大的(或者反着, 必须有序)建有向边. 而连接性我们双向标记. 这样我们在暴力每个点搜索时原创 2017-09-14 22:14:58 · 542 阅读 · 0 评论 -
HDU - 4431 and HDU - 3391 我们一起打麻将 【dfs暴力模拟】
HDU - 4431 HDU - 3391 //这两道题是非常相似的, hdu4431要更难一点, 就以这道题来讲解, 会了这道题, 下面那道题也应该会了. 还有一道Uva的11210(题解) 很像, 但是数据相对弱很多, 不加剪枝也能过, 而hdu4431必须要剪枝, 否则会T. 思路: 1:题目意思是问你什么牌能胡, 所以34张牌一张一张枚举过去就行了 2:胡牌的方式有三种 :原创 2017-10-06 20:54:04 · 677 阅读 · 0 评论 -
UVa --- 11210 中国麻将【暴力深搜】
传送门 //考虑到UVa和LA有一点不熟悉, 我就都是咋VJ上交的题, 链接也是. //这些题的做法就不说了, 我是在白书的基础上加深了点理解自己写的. 代码解释也是直接写在代码中的. //大概思想就是枚举每一种牌,检查是否有了这张牌后可以”和”. 所以直接深搜即可. 拿来练练代码力. 其实后面做了一道hdu的跟这道很像, 但是hdu的那道更难一点, 并且数据更强一些. 这都是后面再加了一些剪原创 2017-08-16 14:47:36 · 623 阅读 · 0 评论 -
POJ 3126 Prime Path 【bfs】
传送门 题意: 给定两个四位数的素数, 然后每次可以将第一个素数的某一位数字变成其他数字, 但是要保证变化后的那个数依旧是素数, 问最少需要多少步可以变成第二素数.很明显的bfs, 先预处理下4位数的素数, 然后直接做bfs即可, 注意就是一些技巧为了书写方便.AC Codeconst int maxn = 1e4+5;bool pri[maxn], vis[maxn];void init()原创 2018-02-25 11:17:23 · 314 阅读 · 0 评论