农夫过河狼羊白菜Java开放封闭_农夫过河——狼羊菜问题

话说一位农夫带着一只狼、一只羊和一个卷心菜过河,无奈船小,农夫每次只能运送一样东西,考虑到狼吃羊、羊吃菜,因此运送的顺序至关重要。

在现实世界里解决这个问题并不困难,相信很多人都已经有了答案,但是如何用程序来解决这一问题,就需要动动脑筋了。

这又是一个与移动物品有关的问题,在前面汉诺塔的例子中,我们已经领略了解决这类问题的方法,大致分为三个步骤:

将现实问题转化为数学问题,即,建立模型;

将数学问题转化为程序问题,即,给出数据结构及算法;

编写程序解决问题。

下面我们就沿着这样的思路来寻找问题的答案。

一、建立模型

首先考虑如何用数学方法表达狼羊菜之间的关系。最简单的数学元素莫过于自然数,而最简单的运算莫过于自然数的四则运算。我们建立如下对应关系:

狼=1

羊=2

菜=3

那么避免狼吃羊、羊吃菜的问题,就转化为求差值的减法问题,当它们之间差值的绝对值等于1时,会发生“危险”,应该加以避免。

二、数据结构及算法

在汉诺塔问题中,我们使用了出发点、落脚点这样的名称,来描述圆盘移动的起点与终点,这里我们也要为移动的起点与终点命名。考虑到河有两个岸,假设农夫从左岸向右岸运送物资,那么将起点命名为左岸,将终点命名为右岸,然后用两个列表分别记录左岸及右岸物品的种类。

初始状态下,左岸列表为(1,2,3),即(狼,羊,菜),而右岸列表为空,当运送完成后&#

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值