随笔分类 - 算法训练-搜索-深搜
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2616方法:深搜树中每一个状态节点包含的信息为:使用武器的标号,怪物还剩余的生命值,以及该节点处于的层数也就是使用了多少个武器。然后分别以每一个武器作为树的根节点以实现暴力深搜。深搜的过程中用到一个很基本的剪枝方法,那就是在搜索过程中维护一个当前已经获取的最优解,该题目中为当前为了消灭怪物使用武器数量最下那个数量MinCount,然后每一个次搜索的时候发现如果再继续搜索很得到次于当前最有解的解,是不会被选择的解,于是再搜索便无意义,所以就剪掉,在该题目中,如果发现当前节点的层数已经大于当前MinCo
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2614方法:就一个很简单的递归深搜,当探寻到一个节点A的时候,表明其可以解答一个题,于是先设置其解答的题目个数是1,然后去以此探寻其子节点,其子节点就是其下一个可以解答的题,可能有多个可以解答的题,于是就用多个子节点,分别递归去计算每一个个子节点下去能接答多少题,去能解答题目数量最多的一个状态子节点的探寻结果和一开始就设置的1相加,得到从该A节点的结果。感想:简单题代码:View Code #include <iostream>#include <queue>#include
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175方法:在每一步都要维护4个信息,当前坐标,当前方向(垂直还是水平),当前已经折了多少次和携带的目标数字。根据这几个信息,在一步深搜索探寻下一步的时候,选择下一步的标准是:没有访问过 && (是可以走的路 || (不是路而是一个和目标数字相等的数 && 该位置就是目标位置))。整个算法的过程是:1.获取输入后验证是否可达,标准为: a.两个位子的数字必须相同。 b.两个位子的数字必须不能有0。 c.目标位置的直接周边4个必须至少有一个0.如果三个条件不能都满足,直
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553方法:1.可以用对称的思想,即:如果N是偶数,则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和,最后再乘以2。如果是奇数,再单独计算一个在N/2+1这个位置的结果。 2.一个皇后如果放在一个位置,要把该位置对应的行列上的位置和以该位置为起点,从左下 和 右下45读的两个方向延伸穿过的位置都设置为不可再放。 3.在状态数中,在第i层为第i个皇后找位子其实就是在棋盘的第i行找。找不到就返回,否则修改棋盘,继续收索,直到第N层也搜索成功,此时给结果加1.感想:后期多看。代...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016方法:建立好状态树,状态树中的每一个节点有4个变量,即 1,当前状态为构造最终目标状态使用了什么数字的数组,后文称usedNums。 2,当前状态为构造最终目标状态还可以使用的数字的数组,后文称avaliableNums。 3,当前状态为构造最终目标状态已经构造了多大的长度,也就是该状态节点在树中的层数,后文称layer。 4,目标状态的长度。每一个状态节点使用当前所在层数-1作为下标,取出已经构造好了的usedNums的最后一个数字x。...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010方法:由于该题搜索的目标状态是准确的状态,即目标状态要求在到达的时候时间刚好是那么多,不能提前到达也不能延后到达,这和时间要在规定时间内或者求最小时间不一样,所以不用广搜用深搜。在深搜的时候要注意几个问题,1.从一个顶点开始向四个方向深搜的之前(要是这个方向可以走的话),要把该顶点设置为不再可走(将该点设置为wall),这样来实现走过的路不能回去再走。而当该顶点四个方向深搜完成后,如果没有找到目标状态,则需要将其还原为可以走,因为有其他顶点开始的深搜会走到该点,而此时该点在这个状态下还没有走过
阅读全文