回 帖 发 新 帖 刷新版面

主题:出个题,农夫带着狼、羊、白菜过河!大家进来看看

一个农夫带着狼、羊、白菜过河,狼吃羊,羊吃白菜,所以不能让它们单独在一起。
编程输出过河的方法
[em4]

回复列表 (共23个回复)

沙发

这道题我不会做
我看是不是可以给个数组
元素分别取值2,1,-1,1分别代表农夫,狼,羊,白菜
如果这些数两两相加不等于0的话,当2不在的时候表示可以让他们在一起
不然不能让他们在一起.
不知这个想法是否可行

板凳

这个思路似乎不错啊
并且应该是可以实施的

当初我们市的重点高中考试我时就有这道题,我好像就是这样回答的,不知道对不对

有见解的朋友可以来讨论一下

3 楼

我现在只是一个想法,就是不知具体实施!请大家伙帮帮忙,搞搞定!

4 楼

这个题的关键在于羊的运用,因为羊是食物链的中节。

5 楼

的确是中节。但是有什么用呢?
不明白

6 楼

也就是说其它的只过一次,而羊则要反复地过河

7 楼


这个思路也不错。能写出程序吗

8 楼

过河的话,用木筏么?
是不是只有人可以操纵木筏呢?

9 楼

我把这道题转化成了找通路的问题
可见http://www.programfan.com/club/showbbs.asp?id=47252

下面是我的程序。

CLS
DIM SHARED leftbank$(10), a(10, 10), s(10), dep   'leftbank存了一些字符串,保存着左岸可能剩下的东西。a存邻接矩阵,s是栈,dep存当前深度,搜索时用。
CALL init   '初始化
dep = 1     'dep初始化成1
CALL dfs(1)

SUB dfs (d)       '没什么说的,依据邻接矩阵搜索
IF d = 10 THEN
  FOR i = 1 TO dep - 2
    PRINT i; ":"; " Leftbank:"; leftbank$(s(i))
  NEXT i
  PRINT "Finish!!"
  END
ELSE
  FOR i = 1 TO 10
    IF a(d, i) THEN
      a(d, i) = 0
      s(dep) = i
      dep = dep + 1
      CALL dfs(i)
      dep = dep - 1
      a(d, i) = 1
    END IF
  NEXT
END IF
END SUB

SUB init   '一些赋值
leftbank$(1) = "MWSV": leftbank$(2) = "MWS": leftbank$(3) = "MWV": leftbank$(4) = "MSV": leftbank$(5) = "MS"
leftbank$(6) = "WV": leftbank$(7) = "W": leftbank$(8) = "S": leftbank$(9) = "V": leftbank$(10) = "Finish"
a(1, 6) = 1: a(6, 3) = 1: a(3, 7) = 1: a(3, 9) = 1: a(7, 2) = 1
a(9, 4) = 1: a(2, 8) = 1: a(4, 8) = 1: a(8, 5) = 1: a(5, 10) = 1
END SUB

10 楼

受faintzw委托,对init子程序作个解释,

M是man,人
w是wolf,狼
s是sheep,羊
v,vegetable,菜

a(1,6)=1的意思:
1是MWSV,6是WV
leftbank=左岸
说明左边可以从MWSV变成WV,即人把羊带过去了

或者这样说:
原来左边有  人,狼,羊,菜
现在有  狼,菜
说明人把羊带到右岸了

我来回复

您尚未登录,请登录后再回复。点此登录或注册