摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175方法:在每一步都要维护4个信息,当前坐标,当前方向(垂直还是水平),当前已经折了多少次和携带的目标数字。根据这几个信息,在一步深搜索探寻下一步的时候,选择下一步的标准是:没有访问过 && (是可以走的路 || (不是路而是一个和目标数字相等的数 && 该位置就是目标位置))。整个算法的过程是:1.获取输入后验证是否可达,标准为: a.两个位子的数字必须相同。 b.两个位子的数字必须不能有0。 c.目标位置的直接周边4个必须至少有一个0.如果三个条件不能都满足,直 阅读全文
posted @ 2013-04-18 14:17 kbyd 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072方法:和1180一样,图中有些位置是所有的搜索路径都可以去走的,题中就是还原装置所在的位置。除此之外还有其他需要注意的地方。1.所有还原装置的位置都不能被设置为已经访问而不能再去访问,这和1180中的楼梯一样。2.一条收索路径经过一个还原装置后,不能再回到该还原装置,因为会产生环路,如下地图:2 1 4 12 1 0 3到从1行2列的1穿过1行3列的还原装置4到达1行4列的1时,由于还原装置的位置如上述第一点说的那样永远不会被设置为已经访问,所以在1行4列的1这个位置广搜的话,会探寻到还原装置 阅读全文
posted @ 2013-04-17 16:47 kbyd 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312方法:对探寻到的点的数目累加的时候,可以选择在刚探寻到一个点时对数目加1,也可以在一个新探寻到的点开始进行新一层探寻的时候对数目加1,即前者记录有多少个点进队列,后者记录有多少出。感想:第2次做的时候选择了第2种方法,两种方法都可以过,本代码使用第一种。代码:View Code #include <iostream>#include <queue>using namespace std;int rowsCount,columsCount;bool visited[25] 阅读全文
posted @ 2013-04-17 10:58 kbyd 阅读(194) 评论(0) 推荐(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.感想:后期多看。代... 阅读全文
posted @ 2013-04-16 17:58 kbyd 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180方法:此题和一般的地图广搜差不多,唯一的变化就是在楼梯那里,楼梯那里考虑的方式如下:1.根据楼梯的初始状态和当时达到楼梯旁边的位置时走的时间来确定这个时候楼梯的方向。2.再根据当时前进的方向 和 当时楼梯的方向确定走过去要多少的时间,是用1还是2.3.不管走过去后时间是多少,如果过去后发现是障碍物或已经去过了,则该位置不进队列,不考虑从该位置开始的一个广搜。4.如果可以从楼梯过去的那个位置进行广搜,那么该位置开始广受的广搜索不能再经过刚才才经过的楼梯,要判断这个信息不能简单通过设置visite 阅读全文
posted @ 2013-04-16 17:37 kbyd 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242方法:将几个r去找一个a的哪个r先找到a 的问题转换成 一个a去找多个r看先找到哪个r问题,可以使用优先队列,建模成一个单源最短路径来解答。但是本程序实现中没有用优先队列,而是就一班的广搜,由于有多个目标,题目要求找到到目标最快的一个目标,所以就在广搜到每一个目标的每一个时候,用达到其的时间用比较的方式去更新当前维护的一个最小到达时间。感想:要换角度思考问题.View Code #include <iostream>#include <queue>using names 阅读全文
posted @ 2013-04-16 14:03 kbyd 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026方法:状态搜索树的节点保存4个东西,坐标x,y,当前总共耗时,其最短路径前驱指针。当前节点根绝自身情况计算出耗时,然后加上前面一个节点累计的耗时得到当前到该节点使用的耗时,配合使用用当前累计时间排序的优先队列使用dijkstra算法原理。感想:图论dijkstra算法,熟悉其证明方法。代码:View Code #include <iostream>#include <queue>#include<stack>using namespace std;int r 阅读全文
posted @ 2013-04-16 13:47 kbyd 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016方法:建立好状态树,状态树中的每一个节点有4个变量,即 1,当前状态为构造最终目标状态使用了什么数字的数组,后文称usedNums。 2,当前状态为构造最终目标状态还可以使用的数字的数组,后文称avaliableNums。 3,当前状态为构造最终目标状态已经构造了多大的长度,也就是该状态节点在树中的层数,后文称layer。 4,目标状态的长度。每一个状态节点使用当前所在层数-1作为下标,取出已经构造好了的usedNums的最后一个数字x。... 阅读全文
posted @ 2013-04-15 14:44 kbyd 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010方法:由于该题搜索的目标状态是准确的状态,即目标状态要求在到达的时候时间刚好是那么多,不能提前到达也不能延后到达,这和时间要在规定时间内或者求最小时间不一样,所以不用广搜用深搜。在深搜的时候要注意几个问题,1.从一个顶点开始向四个方向深搜的之前(要是这个方向可以走的话),要把该顶点设置为不再可走(将该点设置为wall),这样来实现走过的路不能回去再走。而当该顶点四个方向深搜完成后,如果没有找到目标状态,则需要将其还原为可以走,因为有其他顶点开始的深搜会走到该点,而此时该点在这个状态下还没有走过 阅读全文
posted @ 2013-04-15 13:37 kbyd 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1224方法:根据输入数据建立好的图(图中每个顶点会纪录当前累计获取的有趣度和自己本身的有趣度)是不会有回路的有向图,所以可以是用拓扑排序,由于题目输入数据就定下了第一个定点是起点,所以代码中直接从第一个顶点开始扫描的顺序就是拓扑排序的顺序,程序中不需要在进行拓扑排序。按该顺序每访问一个点,就松弛其所有的边,并设置其在最长(短)路径中的前驱。感想:通过聚集分析,时间复杂度是o(v+e).代码:View Code #include<iostream>#include<algorithm 阅读全文
posted @ 2013-04-15 01:11 kbyd 阅读(233) 评论(0) 推荐(0) 编辑