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

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

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

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

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

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

编写程序解决问题。

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

一、建立模型

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

狼=1

羊=2

菜=3

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

二、数据结构及算法

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
农夫过河问题是一个经典的逻辑智力游戏,通常涉及到一位农夫要将一只、一只和一颗白菜带到河的对岸,但是他只有一艘船,船只能容纳他和另外一样物品(不包括船)。 在这个游戏中,农夫必须遵循以下规则: 1. 农夫可以驾驶船只过河,但是他必须在船上才能移动。 2. 不能被留在一起,因为。 3. 白菜也不能被留在一起,因为白菜。 你可以使用C语言来解决这个问题,下面是一个简单的程序实现: ```c #include <stdio.h> int main() { int farmer = 1, wolf = 1, goat = 1, cabbage = 1; // 1表示在左岸,0表示在右岸 printf("农夫过河问题解决方案:\n"); while (wolf || goat || cabbage) // 如果有任意一个在左岸,则继续循环 { if (farmer == 1) // 如果农夫在左岸 { if (wolf == 1 && goat == 1 && cabbage == 1) // 如果白菜都在左岸 { printf("农夫带着过河\n"); goat = 0; } else if (wolf == 1 && goat == 1 && cabbage == 0) // 如果在左岸,白菜在右岸 { printf("农夫带着过河\n"); wolf = 0; } else if (wolf == 1 && goat == 0 && cabbage == 0) // 如果在左岸,白菜在右岸 { printf("农夫带着过河\n"); goat = 1; } else if (wolf == 0 && goat == 1 && cabbage == 0) // 如果在右岸,白菜在左岸 { printf("农夫带着白菜过河\n"); cabbage = 1; } else if (wolf == 0 && goat == 0 && cabbage == 1) // 如果在右岸,白菜在左岸 { printf("农夫带着过河\n"); goat = 1; } } else // 如果农夫在右岸 { if (wolf == 0 && goat == 0 && cabbage == 0) // 如果白菜都在右岸 { printf("农夫带着过河\n"); wolf = 1; } else if (wolf == 0 && goat == 0 && cabbage == 1) // 如果在右岸,白菜在左岸 { printf("农夫带着白菜过河\n"); cabbage = 0; } else if (wolf == 0 && goat == 1 && cabbage == 1) // 如果在右岸,白菜在左岸 { printf("农夫带着过河\n"); wolf = 1; } else if (wolf == 1 && goat == 0 && cabbage == 1) // 如果白菜在左岸,在右岸 { printf("农夫带着过河\n"); goat = 0; } else if (wolf == 1 && goat == 1 && cabbage == 0) // 如果在左岸,白菜在右岸 { printf("农夫带着过河\n"); wolf = 0; } } farmer = 1 - farmer; // 农夫过河 } printf("农夫成功将白菜都带到了对岸!\n"); return 0; } ``` 在这个程序中,我们使用了四个变量来表示农夫白菜的位置(1表示在左岸,0表示在右岸)。我们使用一个while循环,只要有任意一样物品在左岸,就继续循环。 在while循环中,我们根据当前的物品位置和农夫的位置,判断应该带哪一样物品过河。当农夫过河后,我们更新物品位置和农夫位置。当白菜都在右岸时,我们跳出循环,输出“农夫成功将白菜都带到了对岸!”。 这个程序只是一个简单的实现,可能存在一些小bug,但是它可以帮助你理解农夫过河问题的解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值