第 3-3 课:狼、羊、菜和农夫过河问题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:58   2155   0

农夫需要把狼、羊、菜和自己运到河对岸去(不知道为啥要运狼,别问我),只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手的问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。

算法设计思路

这是一个很简单的问题,在狼、羊和菜这个食物链上,关键是中间的羊,因为狼不吃菜,所以要安全过河,农夫的第一件事就是带羊走,拆开这个食物链。但是计算机无法理解这个关键的羊,所以我们仍然采用穷举法来解决这个问题,同时借助于穷举搜索找出所有过河的方法。

这个题目的解决思路和“三个水桶倒水”问题的解决思路类似,就是对状态进行穷举搜索,从初始状态开始穷举所有的状态变化,直到某一次变化后得到问题解决的最终状态,就输出一个结果。前面的几课中已经多次提到穷举法的两个关键步骤,这里不再列出。接下来就直接从这两个步骤入手,介绍如何设计这个问题的穷举算法。

定义问题的状态

在确定以何种方法对解空间进行穷举搜索之前,首先要定义问题的解。虽然这个题目的要求是给出农夫带着他的小伙伴过河的动作,但是单纯考虑对动作的穷举是没有意义的,因为问题最后的解决状态是农夫、狼、羊和菜过到河对岸,能最终产生这种状态的动作才有意义,为了判断动作的有效性,需要定义一个合适的状态来描述这个游戏在某个时刻的局面。考虑一下这个题目涉及的所有元素:农夫、狼、羊、菜、船和河,河是固定的,没有状态变化,因为只有农夫可以划船,所以船可以看作和农夫是一体的,简化后其实有 4 个元素需要考虑,分别

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP