状态搜索,hash保存状态
the_conquer_zzy
计算机科学与技术专业
展开
-
hdu 1043带来的启示(二)
前面提到了康托展开式,主要是把对应排列的康托式作为数组下标,方便找到该排列。 核心思想:利用康托展开式,记录每个排列状态,从最终状态倒序BFS,中间记录到达的每一个排列的经过的步骤,完成搜索后,就把能到达的状态,写到了数组里。以及如何到达的也写到了数组里,直接进行查表就可以了。另外如果用string 类型记录路径会比较方便,但是耗费内存太大,会出现MLE,主要原因是string会开辟实际内存是长度原创 2017-07-06 22:10:22 · 263 阅读 · 0 评论 -
hdu 1067 Gap
这道题和hdu1043 Eight问题可以认为是同一类问题, 针对这道题,是手动实现的hash, 而Eight问题是利用康托展开式 ,康托数和排列一一对应本质还是hash这两道是典型的状态搜索题,这里纪念下 下面是ac代码,思路源于其他网友,这里借鉴#include<iostream> #include<queue> #include<cstring> #include<cstdio> usin原创 2017-07-16 21:32:37 · 273 阅读 · 0 评论 -
hdu 1078 fatmouse and cheese
思想记忆化搜索还有的搜索方式是状态搜索状态搜索,是进行状态映射,以便得知某个状态是否已经搜索过了,是为了避免重复搜索, 状态搜索应用的场景是,简单地标记哪个点有没有走过,已经不再满足需求了。或者说,无法进行标记哪个点是否已经走过。记忆化搜索是,在搜索的过程中,会产生很多重复搜索,但是只要记住第一次搜索的结果值,可以直接用上次的搜索结果,并避免再次搜索,减少了搜索范围,避免了重复搜索。 记忆化搜索的原创 2017-07-23 20:45:44 · 384 阅读 · 0 评论 -
hdu 1072 Nightmare
此題有有意义,纪念下因为此題,特殊在走过的路可以重走,需要进行记忆化搜索,最小时间,肯定使用BFS走过的节点可以重走,但是如果走到这个节点的时间是相同的,则重走这一节点没有意义。 所以和以往传统搜索題不同, 传统的搜索,用visited[x][y]来标记是否走过,以便下次不再重复走 这次,需要再多加一个维度,加上时间 visited[x][y][time] 表示time相同时不需要重走, 此原创 2017-07-20 23:50:09 · 228 阅读 · 0 评论 -
hdu 1180
主题思想 : BFS ,这里有个注意的情况是除了上下左右可以走,也可以不走即可以停留,所以需要把地图上可以停留的点,单独在push进队列。 再一个注意的点就是,当是楼梯时,是根据刚到达的时间,进行变向的,也就是说,到达楼梯需要爬的时间,正好是上一步结束的时间。AC代码:#include <iostream> #include<cstdio> #include<queue> #include<str原创 2017-08-19 20:47:06 · 231 阅读 · 0 评论 -
hdu 1195 open the lock
主题思想 : 首先读题,求最小值,一旦出现求什么最小路径,最小值之类的,考虑BFS。 再看题目,经过某种变化,可以理解为经过某种状态,经过某种变化到达另一种状态,最后到达最终状态,最小步骤数,因此是一道BFS题。 此外,由于要标记已经访问过的节点数,visited,而题目又是一个字符串形式的四位数,因此把字符串对应的数字作为状态的唯一标志,来标记是否访问过。AC代码:#include<iostr原创 2017-08-20 15:39:18 · 210 阅读 · 0 评论