LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4158|回复: 11

农夫过河问题?

[复制链接]
发表于 2004-9-23 16:04:49 | 显示全部楼层 |阅读模式
用C语言编程输出最少步骤的过河方法
有一个农夫带一条狼、一只羊和一棵白菜过河。如果没有农夫看管,则狼要吃羊,羊要吃白菜。但是船很小,只够农夫带一样东西过河。问农夫该如何解此难题?
 楼主| 发表于 2004-9-23 16:49:42 | 显示全部楼层

没人知道吗

自己顶阿?
发表于 2004-9-23 17:09:32 | 显示全部楼层
船需要农夫来划吗?
发表于 2004-9-23 17:53:03 | 显示全部楼层
1、农夫带羊过去
2、农夫回来
3、农夫带狼过去(可以选狼或白菜之一)
4、农夫带羊回来
5、农夫带白菜过去(如果3是带白菜过去,那么5就是农夫带狼过去)
6、农夫独自回来
7、农夫带羊过去

怎么编程输出我不知道,因为我根本不懂编程。

希望对你有用
发表于 2004-9-23 18:37:00 | 显示全部楼层
最初由 redinux 发表
船需要农夫来划吗?

不用吧?
船让白菜来划好了,哈哈!
 楼主| 发表于 2004-9-23 19:11:01 | 显示全部楼层

问题是这个算法的最优方案选择

在无穷多不同的方案中为何选择这个唯一的。(当然是C说明)
发表于 2004-9-23 19:18:02 | 显示全部楼层
根本没有无穷多个方案。
只有上述两种方案。
第一步是唯一的:必须先带羊过河。
第二步是可选的:带白菜,或者带狼;这样就出来了两种方案。
发表于 2004-9-23 19:22:40 | 显示全部楼层
当然不可行的方案有多个。
那就是任务失败的方案,比如,第一步先带走狼的话,羊会吃了白菜:行动失败。
再比如如果第一步带走的是白菜,那么狼会吃了羊:行动失败。
 楼主| 发表于 2004-9-23 19:33:55 | 显示全部楼层

可以先带羊过河

然后可以带或者不带别的东西来来回回
这里有别人Pascal语言的解决方法,我还没搞懂

  1. ************************************************************
  2. 农夫过河问题

  3. 农夫过河问题

  4. 有一个农夫带一条狼、一只羊和一棵白菜过河。如果没有农夫看管,则狼要吃羊,羊要吃白菜。但是船很小,只够农夫带一样东西过河。问农夫该如何解此难题?

  5. 分析:以向量(人,狼,羊,菜)表示状态,其中每个变元可取0或1,取0表示在左岸(出发点),取1表示在右岸,则我们有八个规则:
  6.               (0,*,*,*)--->(1,*,*,*)         (1)
  7.               (0,0,*,*)--->(1,1,*,*)         (2)
  8.               (0,*,0,*)--->(1,*,1,*)         (3)
  9.               (0,*,*,0)--->(1,*,*,1)         (4)
  10.               (1,*,*,*)--->(0,*,*,*)         (5)
  11.               (1,1,*,*)--->(0,0,*,*)         (6)
  12.               (1,*,1,*)--->(0,*,0,*)         (7)
  13.               (1,*,*,1)--->(0,*,*,0)         (8)
  14. 注:每个*号可以是任意的0或1,但是在每条规则内部,左边和右边的对应*号应取相同值。
  15. 将这八个规则存储在一个二维数组rule(8,4)中,易知该数组的内容是:
  16.               (1,  0, 0, 0)
  17.               (1,  1, 0, 0)
  18.               (1,  0, 1, 0)
  19.               (1,  0, 0, 1)
  20.               (1,  0, 0, 0)
  21.               (-1, 0, 0, 0)
  22.               (-1,-1, 0, 0)
  23.               (-1, 0,-1, 0)
  24.               (-1, 0, 0,-1)
  25. 初态是:(0,0,0,0),终态是:(1,1,1,1),
  26. 非法中间状态有:(0,0,1,1),(0,1,1,0),(0,1,1,1),
  27.                 (1,1,0,0),(1,0,0,1),(1,0,0,0)。
  28. 相应的广度优先搜索算法的PASCAL程序如下:
  29. program farmer(output);
  30. {programmer: Cheng Zhengxian    Date: 1995.1}
  31.   const rule:array[1..8,1..4] of -1..1=((1,0,0,0),(1,1,0,0),(1,0,1,0),(1,0,0,1),
  32.                                         (-1,0,0,0),(-1,-1,0,0),(-1,0,-1,0),(-1,0,0,-1));
  33.   type stype=string[4];
  34.   var s:array[1..100] of record
  35.                            info:stype;
  36.                            rn:0..8;
  37.                            father:integer;
  38.                          end;
  39.       ob,mr:stype;
  40.       j,closed,open:integer;
  41.   procedure op;
  42.     var pre1,pre2,k,c:integer;
  43.     begin
  44.       writeln;writeln;c:=0;
  45.       k:=open;pre1:=s[k].father;s[k].father:=0;
  46.       repeat
  47.         pre2:=s[pre1].father;s[pre1].father:=k;
  48.         k:=pre1;pre1:=pre2;
  49.       until pre1=0;
  50.       k:=1;
  51.       repeat
  52.         writeln('Step ',c,':',s[k].info:20,s[k].rn:10);
  53.         k:=s[k].father;inc(c);
  54.       until k=0;
  55.       readln;halt;
  56.     end;
  57.   function extend(var mr:stype):boolean;
  58.     var f:boolean;
  59.         k,x:integer;
  60.         ss:stype;
  61.     begin
  62.       ss:=s[closed].info;mr:='';f:=true;
  63.       for k:=1 to 4 do
  64.         begin
  65.           x:=ord(ss[k])-ord('0')+rule[j,k];
  66.           if (x<0) or (x>1) then f:=false;
  67.           mr:=mr+chr(x+ord('0'));
  68.         end;
  69.       extend:=f;
  70.     end;
  71.   function passchk:boolean;
  72.     var f:boolean;
  73.         k:integer;
  74.     begin
  75.       f:=true;
  76.       for k:=1 to 4 do
  77.         if ((mr[2]=mr[3])and(mr[2]<>mr[1])) or ((mr[4]=mr[3])and(mr[3]<>mr[1]))
  78.         then f:=false;
  79.       if f then
  80.         for k:=1 to open-1 do
  81.           if mr=s[k].info then f:=false;
  82.       passchk:=f;
  83.     end;
  84.   Begin {=========================main program=============================}
  85.     ob:='1111';
  86.     closed:=0;open:=1;
  87.     s[1].info:='0000';s[1].rn:=0;s[1].father:=0;
  88.     repeat
  89.       j:=0;closed:=closed+1;
  90.       repeat
  91.         j:=j+1;mr:='';
  92.         if extend(mr) and passchk then
  93.         begin
  94.           open:=open+1;
  95.           s[open].info:=mr;s[open].rn:=j;s[open].father:=closed;
  96.           if mr=ob then op;
  97.         end;
  98.       until j=8;
  99.     until closed=open;
  100.     writeln('No solution!');
  101.   End.
复制代码
发表于 2004-9-23 20:06:24 | 显示全部楼层
我在书店见过一本英文的LISP教程,里边有这个问题,反正就是递归呗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表