今天看《算法的乐趣》第五章,作者提出问题:把三桶个水桶等分8升水的问题,有8,5,3L的水桶分8升水,最后的结果要在8L水桶和5L水桶中分别有4L水。
首先要定义问题的解,并分析解空间范围和拓扑结构,然后根据解空间的范围和拓扑结构设计遍历搜索算法。
建立数学模型,根节点为初始状态,叶子节点可能是最终状态,也可能是某个无法转换的最终中间状态,有多少个最终状态叶子节点就要多少种答案。
状态的数学模型与状态树:状态的数学模型可以用一个一维数组存放,状态树就是建立起节点与节点之间的联系。
倒水动作的数学模型:合法的倒水动作包含3个要素:倒出水的桶、接收水的桶、倒水的体积。{from,to,water}
搜索算法:确定状态树模型后,第二个重要的问题是:状态树的搜索算法。
可用深度优先也可以广度优先,我写的是深度优先。
状态树的搜索就是对整个树进行遍历,其中还暗含了状态的生产。
状态树的剪枝和重复状态的判断
为了避免状态树的重复和环形死循环,一定要有备忘录。
我就是在处理备忘录的时候没有理解作者的思想,所以出了bug。
后来我用往前遍历,终于成功解