用Java编写农夫过河问题_编程练习题2——农夫过河问题初步求解

Question:

农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,当然也可以不运东西,如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。(参考:http://blog.csdn.net/orbit/article/details/7563220)

本文只是用面向过程的方法,利用二进制位,得出一种过河方法。

深入提问:1.一共有多少种方案,最耗时和最快方案分别是?

2.如何使用面向对象方法设计,使得算法可以扩展至更复杂的方案?如有多个农夫,多种交通工具,多个地点,多种待运输的物价以及他们之间复杂的利害关系。

3.本问题与动态规划算法(如

背包模型)的联系是?

Result:

0 :农夫:北,蔬菜:北,山羊:北,狼:北

安全

10 :农夫:南,蔬菜:北,山羊:南,狼:北

安全

2 :农夫:北,蔬菜:北,山羊:南,狼:北

安全

14 :农夫:南,蔬菜:南,山羊:南,狼:北

安全

4 :农夫:北,蔬菜:南,山羊:北,狼:北

安全

13 :农夫:南,蔬菜:南,山羊:北,狼:南

安全

5 :农夫:北,蔬菜:南ÿ

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值