农夫需要把狼、羊、菜和自己运到河对岸去(不知道为啥要运狼,别问我),只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手的问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。
算法设计思路
这是一个很简单的问题,在狼、羊和菜这个食物链上,关键是中间的羊,因为狼不吃菜,所以要安全过河,农夫的第一件事就是带羊走,拆开这个食物链。但是计算机无法理解这个关键的羊,所以我们仍然采用穷举法来解决这个问题,同时借助于穷举搜索找出所有过河的方法。
这个题目的解决思路和“三个水桶倒水”问题的解决思路类似,就是对状态进行穷举搜索,从初始状态开始穷举所有的状态变化,直到某一次变化后得到问题解决的最终状态,就输出一个结果。前面的几课中已经多次提到穷举法的两个关键步骤,这里不再列出。接下来就直接从这两个步骤入手,介绍如何设计这个问题的穷举算法。
定义问题的状态
在确定以何种方法对解空间进行穷举搜索之前,首先要定义问题的解。虽然这个题目的要求是给出农夫带着他的小伙伴过河的动作,但是单纯考虑对动作的穷举是没有意义的,因为问题最后的解决状态是农夫、狼、羊和菜过到河对岸,能最终产生这种状态的动作才有意义,为了判断动作的有效性,需要定义一个合适的状态来描述这个游戏在某个时刻的局面。考虑一下这个题目涉及的所有元素:农夫、狼、羊、菜、船和河,河是固定的,没有状态变化,因为只有农夫可以划船,所以船可以看作和农夫是一体的,简化后其实有 4 个元素需要考虑,分别 |