广度优先搜索
-
先生成的节点先扩展
-
逐层往下扩展(可记录steps)
-
需要储存空间大
-
勿忘记忆
-
如何表示状态?
-
用合适编码表示状态,减少储存代价——状压
-
编码有时候是正常的数的进制表示相应的状态,有时候则需要进行:排列到序号,序号到排列的转换
-
常用的给定排列求序号:
- 思想:算出有多少个排列比给定排列小
- 具体来讲,就是分别算,1-a放在这一位有多少排列,即(a-1)*(k-i)!
- 可以专门写一个计算阶乘的函数
-
常用的给定序号求排列:
- 假定是x,计算此时的序号,比较大小,再次尝试
-
时间与空间的权衡
- 对于状态数较小的问题,可以用最直接的方式编码以空间换时间
- 对于状态数太大的问题,需要利用好的编码方法以时间换空间
示例:八数码问题(一个状态实际上是0~8的一个排列)
前提:奇排列不能转化成偶排列或相反
代码后补吧~太长了