话说一位农夫带着一只狼、一只羊和一个卷心菜过河,无奈船小,农夫每次只能运送一样东西,考虑到狼吃羊、羊吃菜,因此运送的顺序至关重要。
在现实世界里解决这个问题并不困难,相信很多人都已经有了答案,但是如何用程序来解决这一问题,就需要动动脑筋了。
这又是一个与移动物品有关的问题,在前面汉诺塔的例子中,我们已经领略了解决这类问题的方法,大致分为三个步骤:
将现实问题转化为数学问题,即,建立模型;
将数学问题转化为程序问题,即,给出数据结构及算法;
编写程序解决问题。
下面我们就沿着这样的思路来寻找问题的答案。
一、建立模型
首先考虑如何用数学方法表达狼羊菜之间的关系。最简单的数学元素莫过于自然数,而最简单的运算莫过于自然数的四则运算。我们建立如下对应关系:
狼=1
羊=2
菜=3
那么避免狼吃羊、羊吃菜的问题,就转化为求差值的减法问题,当它们之间差值的绝对值等于1时,会发生“危险”,应该加以避免。
二、数据结构及算法
在汉诺塔问题中,我们使用了出发点、落脚点这样的名称,来描述圆盘移动的起点与终点,这里我们也要为移动的起点与终点命名。考虑到河有两个岸,假设农夫从左岸向右岸运送物资,那么将起点命名为左岸,将终点命名为右岸,然后用两个列表分别记录左岸及右岸物品的种类。
初始状态下,左岸列表为(1,2,3),即(狼,羊,菜),而右岸列表为空,当运送完成后&#