穷举搜索
Contents
实质是创建一个状态树,边建立边剪枝,得到最终状态输出
步骤有:
- 列出表示状态的数据结构
- 列出在状态之间迁移的动作的数据结构
- 列出两个状态转换的所有动作列表
- 创建一个deque存储搜索的状态
- 从deque尾端取出状态,判断是否是最终状态,是的话打印当前deque,进行搜索search,循环所有动作,执行动作searchOnOneAction
- 判断新状态是否有效,有效则加入deque,继续递归调用搜索
有很多问题用到穷举搜索,比如过河问题
三个和尚和三个妖怪过河
船只能载两个
任何时候只要妖怪数量大于和尚数量
妖怪就要吃掉和尚
求解过河方案
这个问题首先确定状态的数据结构,状态就是两岸monk和monster的数量,同时有一些配套操作
- 判断是否是最终状态
- 状态迁移
- 判断状态是否有效
|
|
动作有如下定义
|
|
得到action的列表,作为穷举的依据
|
|
搜索时
|
|
两个函数起到了递归的作用,同时使用deque避免出现环路
|
|
完整代码见https://github.com/lclei/algorithm_fun/tree/master/MonkAndMonster
最后的找到了四种方案
|
|
Author lclei
LastMod 2019-12-08