zoj 1505||poj 1198 Solitaire(双向bfs)

这道题很带感啊,看了一个星期了,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.csdn.net/tiaotiaoyly/archive/2007/08/01/1720450.aspx

http://blog.csdn.net/skywalker_sun/article/details/5857898#comments

zoj上的注释全都变成了????了,唉,之前应该在poj上也交的。

你可能感兴趣的:(c,算法,优化,vector,存储)