![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dfs
深度优先搜索
Rancho__
这个作者很懒,什么都没留下…
展开
-
试题编号: 201803-4 试题名称: 棋局评估 (对抗搜索 博弈)
这题真的是一道很不错的题,首先我对题意的理解有点问题,我以为的最优策略是,用最优的策略取胜,但是题目的意思是用最优的策略取得最好的得分。到哪个人行棋,就暴搜哪个人的可选的每一步,然后比较下一个人行棋所得的结果,取最优。例如当alice行棋时,就让alice下一步棋的得分取bob最优行棋的分数,然后alice有不同的点可以下,就让alice下一步走法的最优解等于alice走完下一步之后,对应的b...原创 2019-12-23 20:30:21 · 271 阅读 · 0 评论 -
1018 Public Bike Management (30分) (迪杰斯特拉+dfs)
思路就是dijkstra找出最短路,dfs比较每一个最短路。dijkstra可以找出每个点的前一个点, 所以dfs搜索比较的时候怎么处理携带和带走的数量就是关键,考虑到这个携带和带走和路径顺序有关,所以可以用下面的写法,看代码就可以了。最开始的时候是想用一个偏动态规划的写法做,但是因为题目的显示,既要带去的车数量最少,又要求从一个点带走的车数量最少,所以如果过动规的话,对于一个点的多个最短路,...原创 2019-12-21 17:01:55 · 186 阅读 · 1 评论 -
The Preliminary Contest for ICPC Asia Xuzhou 2019 G Colorful String(回文自动机+dfs)
这题建立一棵回文树,然后用dfs搜索答案,但是有一点需要注意,就是打vis的标记时,如果标记为1,那么在好几个节点都对同一个字符i打过标记,此时的搜索从字符i点回溯,回到它的父亲节点,搜索其它的字符,回溯的时候把vis[i]标记成0了,之前的vis[i]标记全被清空了,如果该父亲的其它字符节点下,有字符i的孩子,则此时统计就会出错。所以打vis标记的时候让vis++,而不是标记为0。#inclu...原创 2019-10-02 15:57:44 · 101 阅读 · 0 评论 -
试题编号: 201809-4 试题名称: 再卖菜 记忆化搜索
这题一看就是搜索,然后我不会写,咯咯咯。看了题解发现好简单,这是一个递推式,令d[n] 为第n家第一天的菜价 a[n]为第n家第二天的菜价则 (d[n-1]+d[n]+d[n+1]) / 3 = a[n]d[n+1] = 3 * a[n] - d[n-1] - d[n] + k (k=0,k=1,k=2)递推一下就可以了,但是对于第n天,n-1天的菜价为x,第n天的菜价为y , ...原创 2019-12-12 17:23:26 · 181 阅读 · 0 评论 -
hihoCoder-1049-后序遍历
这里参考了一位大神的代码,写法很简洁,思路其实就是这样,学过先中后序遍历的人,基本上都能看懂。每次进入递归程序之后,就找到根节点,然后把左子树传给递归程序,然后把右子树传给子递归程序,然后输出这个根节点。#include <iostream>#include <string>using namespace std;void post_order(const ch...原创 2019-02-12 16:49:48 · 122 阅读 · 0 评论 -
HDU-2041-超级楼梯
这题是一道简单的递归题目,也是一道简单的动规题,我们有两种以上的写法。我们要走到n阶的话,我们肯定要走到n-1阶或者n-2阶。递归#include &amp;lt;cstdio&amp;gt;int f(int n){ if (n==1) return 1; if (n==2) return 2; return f(n - 1) + f(n - ...原创 2019-01-30 15:58:02 · 130 阅读 · 0 评论 -
逆波兰表达式
逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰 表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如 (2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符 包括+ - * /四个。输入输入为一行,其中运算符和运算数之间都用空格分隔,运...原创 2018-11-05 21:54:29 · 186 阅读 · 0 评论 -
openjudge-4017 爬楼梯
总时间限制: 1000ms 内存限制: 65536kB描述树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级也可以第一次走两级,第二次走一级,一共3种方法。输入输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 30输出不同的走法数...原创 2018-11-08 15:46:21 · 378 阅读 · 0 评论 -
Openjudge-2787-算24
这题的话,我们思考一下,我们首先选两个数进行计算,两个数计算之后是一个数,加上之前的两个数,就是三个数。然后再进行计算,再选两个数再进行计算,然后剩下两个数,然后再进行计算,就剩下一个数了, 这时候我们就判断它是否等于二十四。判断的方法是浮点数的精度进行比较,我们设一个10的-6次方精度,如果某浮点数与24的差的绝对值小于这个精度,我们就判定它们相等。计算的方法有6种,加减乘除,减和除...原创 2018-12-08 11:19:19 · 396 阅读 · 0 评论 -
Openjudge-4132-四则运算表达式求值
这一题我们可以通过递归求解,首先我们可以把一个表达式分为三部分,分别是:(1)表达式 :项、加减(2)项:因子、乘除(3)因子:数、()表达式这三项构成了递归的关系,我们可以看到,要求一个表达式的值,我们首先要求一个项的值,要求一个项的值,我们首先要求一个因子的值,要求一个因子的值,我们首先要看它是由什么组成的。它既可以是由表达式加上括号组成的,也可以是由数组成,当发现它是数时...原创 2018-12-05 18:52:46 · 278 阅读 · 0 评论 -
Openjudge-2694-逆波兰表达式
这是波兰表达式,题目中叫它是逆波兰式。这个题的话,我们用递归求解,首先理解一下波兰表达式,就是将运算符前移了。像是二叉树的遍历一样,前序遍历就是波兰式,中序遍历就是中缀表达式,后序遍历就是逆波兰表达式。我们读入一项之后就进行处理,这里的读入因为题目中给出了空格,也就是一次读入的结束,所以我们每次读入的都是分隔的字符,浮点数的字符也是被分隔的,所以我们就可以直接使用atof函数将字符转浮...原创 2018-12-05 18:51:04 · 250 阅读 · 0 评论 -
OpenJudge-百练-2755
这道题用递归写的话还是很好写的,我们设递归函数的名称为Ways(w,k) 。它的含义就是,w的大小,取k个物品,有多少种方式。我们可以知道递归的边界条件就是当w的大小为0的时候,我们的方法数只有一种,但是当我们要取0个物品的时候,我们的方法数就为0了,因为Ways(40,0),显然是0。边界条件知道以后,我们就可以知道对于物品k来说,我们有两种策略,一种是选它,一种是不选,我们把总的方...原创 2018-11-24 15:13:18 · 110 阅读 · 0 评论 -
快速排序
快速排序是一种分治的思想。每次快速排序的时候,都是用第一个数来比较的,然后设置两个指针,一个i 一个 j ,一个指向首位,一个指向末尾。然后从末尾开始比较,如果 a [ j ] 大于a [ 0 ] 的话那就让j--,直到后面的数有一个小于 a [ 0 ],然后开始进行 i 指针的比较,如果 a [ i ] 小于 a [ 0 ] 的话,就让i++,直到前面的数有一个大于 a [ 0 ],然后...原创 2018-11-17 16:55:12 · 72 阅读 · 0 评论 -
归并排序理解递归
https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F先上一个网站,这个 网站最好看看。点开之后可以看到归并排序的动态演示图,只要能理解这个图,就能够理解递归和归并排序了。你可以看到图里面的数分了四层,然后变成八个数,但是每两个数是一个递归里面的,所以先从第一个和第二个数开始归并,归并的时候比较大小,归并完之...原创 2018-11-17 16:24:39 · 382 阅读 · 0 评论 -
POJ-3050-Hoscotch
这是一道简单的深搜题目,题意说的是给一个5*5的棋盘,里面填满数字,然后跳到一个格子上,这是第一步,接着向上下左右四个方向任意一个方向走一步,一共走6步,问我们走过的数字组成的一个6位数有多少种不同的方案。那这就是一个集合嘛。我们同样也可以通过打vis标记来做都可以,纯c加O(1)的查询还是快一些。这个是可以退出的,当我们所以的点走完之后就自然退出了,因为for循环结束之后,整个dfs就结束...原创 2019-02-12 18:01:57 · 110 阅读 · 0 评论 -
PTA----7-3树的遍历
7-3 树的遍历 (25 分)给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:72 3 1 5 7...原创 2019-02-23 10:59:37 · 600 阅读 · 0 评论 -
HDU-1078-FatMouse and Cheese
这题就是记忆化搜索,其实很像数位dp的写法。这题首先,看一眼,甚至看好几眼都看不出边界在哪,让人有点摸不着头脑。所以我们直接开一个dp数组,让dp数组反向更新一个最大值,然后上层的递归直接使用就可以了。这时候边界条件就很明显了,sum = max(sum, dfs(dx, dy)); 也就是说这一个点之后的最大值,应该和下一个点的最大值进行比较更新。最后我们更新dp数组,让它加上这一个点...原创 2019-02-18 10:05:56 · 81 阅读 · 0 评论 -
POJ-1724 深搜剪枝
这道题目如果数据很小的话。我们通过这个dfs就可以完成深搜:void dfs(int s){ if (s==N) { minLen=min(minLen,totalLen); return ; } for (int i=0;i<G[s].size();i++) { Road r=G[s][i]; if (r.t+totalCost>K) con...原创 2018-11-29 15:51:47 · 168 阅读 · 0 评论 -
Openjudge-百练-4013-踩方格
这题目是一道深搜的题目,我们写一个递归函数叫Ways(int i, int j ,int n),i j就是当前所处的坐标,我们设置一个visited数组,简称 V 。对于这个数组,首先初始化为零,然后我们递归的边界条件就是走完输入的步数的时候,就返回一。如果没走完,就对当前的visited数组,当前的位置标记为一,说明已经走过,我们继续向下递归的时候,就不能再走这一块了。也就相当于是,...原创 2018-11-28 20:42:53 · 396 阅读 · 4 评论 -
Openjudge-2815-城堡问题
对于这道题目来说的话,我们的思路是这样的,我们首先把数据读进来,然后把color数组清零。我们的思路是这样的的,给每一个房间设置一个对应的color数组,然后color数组里面填满不同的数字,每一种数字都代表着一种联通的房间。相互联通房间里面,对应的color数组填的就是相同的数字,然后对每个房间计数,然后比较之后得出最大的计数值就行了。那我么怎么对这房间里面填不同的数字呢?那就用...原创 2018-11-26 19:29:56 · 164 阅读 · 0 评论 -
POJ-1979-Red and Black
这题深搜的的话,我们进入一个点的时候,我们就把步数加一,然后这个点标记为0,然后再向其他的方向走,这是正确的思路。错误的思路就是,先走向四个方向,然后标记下一个方向的点,然后进入dfs,这个思路没有太大的毛病,但是有一个问题,如果周围都不能走,那我们就不能通过原点之后的下一个点,再次走回原点了,这个思路就错在这个地方。#include <iostream>#include <...原创 2019-01-24 10:04:19 · 120 阅读 · 0 评论 -
HDU-1312-Black and Red
这题其实和POJ的1979是同一道题,当时POJ使用cin写的,所以读入的时候,就很正确。这次用scanf读入的时候,就出现了问题,我们在读完宽高之后,要用getchar吸收掉回车,然后每行末尾的回车也要用scanf吸收掉。对于深搜函数的写法有多种,我在代码里面列了两种。#include <cstdio>#include <cstring>int map[25][...原创 2019-01-26 17:13:38 · 113 阅读 · 0 评论 -
HDU-1010-Tempter of the Bone
这题的题意说的是,一个小狗贪吃中了陷阱的故事,问小狗是否能在T时刻到达出口位置。这题的话,因为不是寻求最短路嘛,所以我们用dfs,我们搜索之前可以得到一个式子,就是如果空白块要少于我们要走的步数的话,那我们就永远也走不到。因为题目中说的是,我们不能回头,而且一个砖块只能停留一秒,所以我们就要刚刚好到达,所以就有了上面的式子。这是第一个剪枝,还有另一个剪枝,名叫奇偶性剪枝。所谓奇偶性剪枝就是...原创 2019-01-27 12:46:52 · 245 阅读 · 0 评论 -
HDU-1455-木棒
这题的话,我们,定义一个结构体,然后把木棒从大到小排序。这些木棒如果是由多根等长木棒组成的,那目标长度一定大于等于其中最长的木棒长度,所这就是我们搜索的下限。上限就是所有的木棒组成了一根木棒,就是所有木棒长度的总和,确定了搜索范围之后,我们再来确定搜索的边界。其实搜索的边界很明显,就是当拼接而成的木棒根数跟我们期望的目标根数相同的时候,这时候,说明我们的假设就是正确的。至于其它的,就在代码...原创 2019-01-23 11:35:38 · 663 阅读 · 0 评论 -
HDU-1241-油藏
这题一道深搜的简单题目,其实题目的思路就只是向八个方向搜索,然后把整个油田遍历一遍即可。#include <cstdio>#include <cstring>int map[105][105];int vis[105][105];char l[105];int n, m, color, ans;int d[8][2] = {{1, 0}, {-1, 0}, {...原创 2019-02-04 11:51:08 · 140 阅读 · 0 评论 -
HDU-1016-素数环
这题是一道深搜的题目,题意是给你一个n,让你寻找一个环,环中的相邻数字相加是素数,且要用尽所有的数。输出即按照字典序,输出所有的可能。这题的话,我们搜索的下一个状态就是升序的1~n中的数字,递归的边界条件就是第n个数字和第一个数字相加为素数。我们进入递归的条件就是如果我们还没使用过这个数字,并且它和上一个数相加是素数,我们就递归搜索它,然后回溯。我们要想使环中的相邻数字相加为素数,当我们按...原创 2019-02-04 16:54:10 · 130 阅读 · 0 评论 -
HDU-2018-奶牛的故事
这题找到递推式就好写了,递推式大致是:f=n (n<=4)f=f(n-1)+f(n-3) (n>4)其实这题的题意,我觉得是有很大的问题的,它前后说的每年年初的意思都不一样,敬请参考,我发现这样可以符合答案。第一年之后一个小母牛,第二年有了小母牛和她的孩子,接着三年四年都出生了两个孩子,第五年的时候,第二年出生的孩子按照虚岁计算,即出生也算一岁,这时候整好是第四个年头,...原创 2019-01-29 12:41:21 · 198 阅读 · 0 评论 -
N皇后递归
问题:n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在 n*n的棋盘上,互相不能攻击,输出全部方案。#include <iostream>using namespace std;int N;int queuePos[100];//用来描述每一个皇后所摆的列数void NQueue(int k);int main(){ cin >> N;...原创 2018-11-01 17:51:22 · 179 阅读 · 0 评论 -
POJ-1321-棋盘问题
这一题的话,我们搜索的时候,边界条件就是棋子的数目等于k,这时候方案数加一然后return。如果超过行号的最大值,我们也返回,不过不做任何操作,这也是一个边界条件。如果 r 行的 j 个位置是棋盘并且这一列没有放入棋子,我们就放入一颗棋子,该列标记为1,已放棋子数加一,然后访问下一行。这个递归结束以后,我们就把它的标记清空,放入棋子数减一,还原之前的情况,然后递归搜索这一行不放棋子的方案数。...原创 2019-01-23 16:16:39 · 139 阅读 · 0 评论 -
openjudge(POJ)-1664 放苹果
对于n个盘子,m个苹果,我们要么在每个盘子上都放苹果,要么至少有一个盘子不放。一个盘子不放就是f(m,n-1),全部都放的时候苹果就变成了n-m个,但是盘子的数目是不变的,因为此时还没有产生方案数,都放也等于不放嘛。如果盘子的数目多于了苹果的数目,那我们就只能在m个盘子中放苹果了,其余的盘子都是一样的,所以就不用管。如果苹果数目等于零,依题意,方案数为1。盘子数目为0,那方案...原创 2018-11-08 15:34:52 · 256 阅读 · 0 评论 -
HDU-4848-Such Conquering
这题就是深搜加剪枝,有一个很明显的剪枝,因为题目中给出了一个deadline,所以我们一定要用这个deadline来进行剪枝。题目的意思是求到达每个点的时间总和,当时把题看错了,卡了好久。剪枝一:走到这个点的时间+再走到下一个点的时间>该点的死线剪枝二:我们预测剪枝,因为我们要求的是总时间,所以我们每一步要走的点,都要被后面的点用上。我们每走一步的时间,后面点都要加上,因为它也走了。所...原创 2019-02-17 18:17:39 · 164 阅读 · 0 评论 -
POJ-1190 蛋糕问题
这道题目我们使用深搜加剪枝的方法来写,我们首先算出一个最小表面积和最小体积来,就是半径从一递增,高度也从一递增,这是题目要求。然后我们计算出一个底层最大的半径和最大的高度,我们就从这个最大半径和最大高度开始深度优先搜索,每一层的蛋糕都从最大半径开始深搜,然后内循环里面同样是对应每一层不同半径不同高度的深搜,所以就是双重循环进行搜索。但是在搜索之前我们要进行剪枝,第一个剪枝是在边界条件里面,...原创 2018-11-30 12:44:18 · 129 阅读 · 0 评论