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

本文深入探讨了使用Map、Vector等数据结构及状态压缩技术解决编程问题的方法,通过具体实例展示了如何高效地处理大规模状态空间。文章详细介绍了Map的使用方式、Vector的动态数组特性以及状态压缩在简化复杂状态表示中的应用。同时,作者分享了在实现过程中遇到的陷阱和优化策略,例如避免双向广度优先搜索时的队列空检查错误。通过阅读本文,读者将能更好地理解这些工具在实际编程场景中的应用,并提升解决复杂问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题很带感啊,看了一个星期了,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上也交的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值