这道题很带感啊,看了一个星期了,map,vector,状态压缩之类的之前都没接触过借助这个题目学到了很多东西。
说题之前做个笔记先:
Map(底层由红黑树实现)
提供了1对1的数据处理能力。
Map<key,value>M;
Value=M[key];
Map的几种用法:
插入的3种方式: M.insert(pair<key,value>(…,…));
M.insert(map<key,value>::value_type(…,…));
运用迭代器,指针
M.size()返回长度
M.clear()清空
Map特点:
1. 存储 key-value对
2. 支持快速查找,查找的=复杂度为log(n);
3. 快速插入,快速修改,快速修改标记
这里只是最简单的。
本题适用map好处不言而喻。
记录距离,由于状态只有8^8=16777216 个,但是为了方便,
用到了8位十进制的整数来保存,这样就有10^8=100000000 个数了,内存肯定溢出
Vector用法
实现了动态数组,用于元素量变化的对象数组。
Vector<int >V;
V.push_back(i);把元素存入到Vector中
V.pop_back() 删除数组的最后一个元素
V.begin() 数组第一个位子
V.end() :数组最后一个元素的 后一个位置、
状态压缩:(适用于搜索和DP的优化)
最常见的是二进制压位。
这里仅就本题做个解释。
如A,B,C三个关键字均小于100可将其压缩成A*10000+B*100+C
如本题的四个坐标八个数,就将其压成了一个8位数。
关于双向广度优先搜索。在选择结点少的一边开始做的时候,要判断下队列是否为空,否则选择时可能会选到队列空的那一边,内存会读出错。偶就在这里犯了错误。
了解了以上知识再看本题也就不那么难了。跳的时候,只需就当前位置是否有旗子判断下就行。队列压的时候只要压八位数状态就行,判断时解压。很多技巧都是看到别人那里学来的。
具体的算法可以看:
http://blog.youkuaiyun.com/tiaotiaoyly/archive/2007/08/01/1720450.aspx
http://blog.youkuaiyun.com/skywalker_sun/article/details/5857898#comments
zoj上的注释全都变成了????了,唉,之前应该在poj上也交的。