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

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

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

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

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

编写程序解决问题。

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

一、建立模型

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

狼=1

羊=2

菜=3

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

二、数据结构及算法

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

初始状态下,左岸列表为(1,2,3),即(狼,羊,菜),而右岸列表为空,当运送完成后,左岸列表为空,右岸列表中包含了狼羊菜三项(无需考虑顺序)。这就是我们解决这一问题所采用的数据结构。

接下来考虑如何实现两个状态之间的转化。首先从左岸移动到右岸:按照某种规则从左岸列表中选取一个列表项(选取的条件是左岸不存在“危险”),将该列表项添加到右岸列表中,并从左岸列表中删除该项;然后从右岸返回左岸:如果右岸列表中存在“危险”,则从右岸列表中选取一项,转移到左岸列表中。重复上述操作,直至左岸列表为空。以上是我们解决问题的核心算法。

除了上述的数据结构及算法外,还需要制定一个移动的规则,与解决汉诺塔问题相似的规则是,不能连续移动某个物品。

有了以上结论,我们可以开始编写程序了。

三、设计简单的用户界面

如图1所示,用户界面非常简单,一个水平布局组件中容纳了两个标签组件,组件的属性设置见图中的文字。上传一个河流的图片素材文件,把它设为水平布局组件的背景图。计时器组件采用默认设置。

图1 应用的用户界面

四、编写程序

1、声明全局变量

如图2所示,声明了4个全局变量,其中的对照表是一个键值对列表,用来保存物品与数字之间的关系,左岸及右岸列表用于保存两岸的物品,左到右用来保存当前的移动方向——从左到右或从右到左。

图2 项目中的全局变量

2、创建过程

(1) 有返回值过程——危险

如图3所示,给定两个参数n1与n2,当它们差值的绝对值等于1时,返回值为真。

图3 有返回值过程——危险

(2) 有返回值过程——被移动项

如图4所示,有返回值的过程——被移动项,返回初始状态时左岸列表中的确保安全的被移动项,返回值为数字1、2或3。

图4 有返回值过程——被移动项

(3) 有返回值过程——显示文字

如图5所示,该过程的参数数字列表,可能是左岸列表或右岸列表,该过程将列表中的数字转化为对应的文字,以便在屏幕上显示直观的内容。

图5 有返回值过程——显示文字

(4) 过程——显示移动结果

如图6所示,该过程将左岸及右岸列表中的数字转化为文字,并分别显示在左岸及右岸标签上。

图6 显示移动结果过程

(5) 过程——右移物品

如图7所示,右移物品过程有两个分支:在初始状态下,从3个列表项中选出一个安全的可移动项;在其余状态下,选择列表中的第一项作为移动项。移动物品的操作由添加和删除列表项来完成,然后将移动结果显示在标签中(调用显示移动结果过程),最后,将移动状态改为从右到左(全局变量左到右=假)。

图7 右移物品过程

(6) 过程——左移物品

如图8所示,该过程只处理右岸有两件物品且存在危险的情形。当存在危险时,选择右岸列表中的第1项作为被移动项,想想看为什么?

图8 左移物品过程

在右移物品过程里,我们将被移动项添加到了右岸列表的结尾,因此,为了确保不连续移动,就必须选择列表中的第1项为被移动项。

3、  事件处理程序

如图9所示,当屏幕初始化时,显示左岸及右岸列表的内容,然后,每当到达计时点是,根据全局变量左到右的值,分别执行不同的移动操作,直到左岸列表为空时,让计时器停止计时,程序运行结束。

图9 事件处理程序

至此这个问题已经得到解决,测试结果如图10所示,左图为起始状态,右图为完成状态。

图10 项目的测试结果

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

  1. 农夫过河狼羊白菜Java开放封闭_狼、羊、菜和农夫过河问题编程实现

    用二进制数 记录状态 1 1 1 1 1 A岸 狼 菜 羊 农夫 最高位表示 A/B岸边,后面分别表示 狼菜羊农夫,0 说明这个岸边没有,1表示这个岸边有 根据题目条件 还要去掉 狼羊 单独 羊菜 单 ...

  2. 农夫 狼 羊 白菜 java,农夫、狼、羊、白菜(回溯法求解)

    为了复试准备,最近做了很多上机题,映象最最深的就是一道关于农夫.狼.羊.白菜的问题.该问题描述如下:有一个农夫带一只羊.一筐菜和一只狼过河.果没有农夫看管,则狼要吃羊,羊要吃菜.但是船很小,只够农夫带 ...

  3. 农夫 狼 羊 白菜 java,一个农夫带着一头狼,一头羊和白菜过桥,一次只能带一样过桥,狼会吃羊,年会吃白菜,请问农夫该怎么办?...

    一个农夫带着一头狼,一头羊和白菜过桥,一次只能带一样过桥,狼会吃羊,年会吃白菜,请问农夫该怎么办?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让 ...

  4. 农夫养牛问题怎么用java实现,经典的农夫养牛问题(Java实现)

    经典的农夫养牛问题(Java实现) 问题描述:一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛--问农夫10年后有多少头牛?n年呢?(用JAVA实现) 问题解 ...

  5. 基于随机遍历的羊菜狼问题(JAVA实现)

    1. 问题分析: 面对这种穷举难度不大的问题首先想到的自然是穷举法.但是由于是算法问题,所以思考是否能对穷举法进行一定的优化. 根据题目已知,狼和羊不能同时呆在一侧,羊和白菜也不能同时呆在一侧,由于在 ...

  6. java农夫过河问题_农夫过河问题——C语言程序设计(转)

    一个农夫带着一只狼.一只羊和一棵白菜,身处河的南岸.他要把这些东西全部运到北岸.问题是他面前只有一条小船,船小到 只能容下他和一件物品,另外只有农夫能撑船.另外,因为狼能吃羊,而羊爱吃白菜,所以农夫不 ...

  7. 状态的抽象:从狼羊白菜游戏和倒油问题说起

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址http://www.cnblogs.com/Colin-Cai/p/7507317.html 作者:窗户QQ/ ...

  8. java农夫过河_农夫过河问题(java版)

    packagecom.my.courseDesign;public classCourseDesign {/** 1. 首先分为A岸,和B岸,A岸用0来表示,B岸用1来表示,在船上用1来表示,不再船上 ...

  9. java类农夫过河问题_农夫过河问题,从JAVA代码看算法

    这个是解决简单的农夫问题的代码代码如下:publicclassAcrossTheRiver{//定义三个String对象publicstaticfinalStringsheepName="羊 ...

最新文章

  1. php7 定义变量,基于PHP7的PHP扩展开发之七(定义变量)
  2. .net framework开发winform_这个Winform的UI库也太全了!四十多个控件都在这一个项目里了...
  3. Android 性能分析工具dumpsys的使用(自己增加一部分在后面)
  4. 【转】最流行的编程语言JavaScript能做什么?
  5. c语言两个正整数的最小公倍数,C语言求两个正整数的最小公倍数
  6. C#中二进制和流之间的各种相互转换
  7. python中的星号和乘号_Python 函数中参数前面一个和两个星号(**)的区别
  8. 美团陶云霜:CRM平台建设实践(胶片)
  9. asp.net中的加密方法
  10. (转) C# Async与Await的使用
  11. mysql druid读写分离_springboot+mysql+jpa+sharding-jdbc+druid读写分离
  12. QTP自动化测试最佳实践
  13. 数据统计分析(SPSS)【8】
  14. TI C6000 TMS320C6678 DSP+ Zynq-7045的PS + PL异构多核案例开发手册(4)
  15. 超声波传感器测距实验430
  16. Java基础_week6
  17. OLAP系统核心技术点,每一点都值得单独收藏
  18. PA2.2 PA2.3
  19. Software-Defined Networking:A comprehensive Survey
  20. Error in v-on handler: “TypeError: this.$refs.popup.isShow is not a function“

热门文章

  1. Puppy Linux作服务器,我为什么要用Puppy Linux
  2. 浦东电商行业协会十周年庆活动隆重举办
  3. Java毕业设计:校园二手闲置物品交易网站(java
  4. TrustZone 基本信息介绍大全
  5. C++ decltype类型提示符总结
  6. Redis分布式部署
  7. USES_CONVERSION宏定义
  8. CDH部署完成后启动失败的解决方案
  9. python-查找字符串
  10. 证券公司信用风险管理体系—以平安证券为例-课后检验-满分