数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 12018|回复: 22

编程求解

[复制链接]
发表于 2003-8-17 20:04:13 | 显示全部楼层 |阅读模式
题目是:三名商人个带了一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行。随从们密约,在河的任何一岸,一但随从的人数比商人的人多,就杀人越货,但是如何乘船渡河的大权掌握在商人们的手中,商人们这样才能安全渡河呢?


希望能用c或c++,或matlab编程求解。一起努力吧。
发表于 2003-8-17 23:03:07 | 显示全部楼层
开始上一具商人一个下人,然后商人下船。下人辶反回
if(左侧商人=下人)下人上船
if (左侧商人>下人)商人上。
发表于 2003-8-17 23:27:33 | 显示全部楼层
不,上面的错了,应该是先上一个商人一个下人,过河后下人下船。商人返回。然后对岸上:
 左侧(没过河的):
如果商人=下人,下人上船,如果商人>下人,商人上船。
右侧:如果商人=下人,商人下船,下人返回。
   如果商人>下人,下人下船,商人返回。
发表于 2003-8-18 23:41:06 | 显示全部楼层
老大们,看清楚,自己划船,计算机实现我没考虑好,不过答案很简单呀
先2下人---回一下人---再过2下人----回来一下人------过去2商人-----回来一商人一下人-----过去2商人----回来一下人----过去2下人-----回来一下人----过去2下人----完
发表于 2003-8-19 03:55:01 | 显示全部楼层
机器就是笨,没编出来。让机器思维难呀。
发表于 2003-8-20 04:35:51 | 显示全部楼层
昨夜梦醒,思路犹在,推醒爱机,狂敲猛编,得如下程序
发表于 2003-8-20 04:38:09 | 显示全部楼层
/*采用递归编程,找到一种过河方案就返回而不是找出所有方案*/
int a[4][10];/*存放过河教程的数据,a1岸上商人b1下人过河后用a2b2表示*/
int guohe(int a1,int b1,int i,int j)
  {
    int m,n;
    if(i>=10||(a1!=0&&a1<b1))  return (-1);
    a[0]=a1;
    a[1]=b1;
    a[2]=0;
    n=1;/*过两商人*/
    if(a1>=1&&n!=j)
    {
      if((a1==3&&b1<2)||a1==2)
      m=fanhui(a1-2,b1,i,n);
      if(m==1)
      {
        a[2]=n;
        return 1;
       }
     }
     n=2;/*过一商一下人*/
     if(a1==b1)
     if(a1>0&&b1>0&&n!=j)
      {
         m=fanhui(a1-1,b1-1,i,n);
         if(m==1)
         {  a[2]=n;
           return 1;
          }
       }
       n=3;/*过两下人*/
       if(b1>1&&j!=n)
       { if((a1!=3&&b1-2>=a1)||a1==3)
          { m=fanhui(a1,b1-2,i,n);
            if(m==1)
             {a[2]=n;
              return 1;
              }
           }
         }
       return (-1)   ;
     }
int fanhui(int a1,int b1,int i,int j)
{
    int m,n,a2,b2;
    if(a1==0&&b1==0) return 1;
    a2=3-a1;b2=3-b1;
    a[3]=0;
    n=1;/*返回两商人*/
    if(a2>1&&n!=j)
    {  if((a2==3&&b2<2)||a2==2)
      {m=guohe(a1+2,b1,i+1,n);
       if(m==1)
       {a[3]=n;
       return 1;}
       }}
     n=2;
     if(a2>0&&b2>0&&n!=j)
       { m=guohe(a1+1,b1+1,i+1,n);
       if(m==1){a[3]=n;return 1;}}
     n=3;
     if(b2>1&&j!=n)
     {if((a1>1&&b1+2<=a1)||a1==0)
      m=guohe(a1,b1+2,i+1,n);
      if(m==1){a[3]=n;return 1;}
     }n=4;/*返回一商人*/
     if(a2>b2||a2==1)
     { m=guohe(a1+1,b1,i+1,n);
        if(m==1){a[3]=n;return 1;}
     }n=5;/*返回一下人*/
     if(a1==0||a2==0)
     {m=guohe(a1,b1+1,i+1,n);
     if(m==1){a[3]=n;return 1;}
     }}
  main()
  {int i,j;
   clrscr();
    if(guohe(3,3,1,0)!=1)printf("can't");
    else
    {for(i=0;i<4;i++)
      {for(j=1;j<10;j++)
      printf("%d ",a[j]);
      printf("\n");
      }}}

答案的意义
第N轮过 1 2 3 4 5 6
    3 3 3 2 0 1 0 0 0 过可前岸上商人的数量
    3 2 1 2 3 1 0 0 0 过河前岸上下人的数量
    2 3 1 1 3 2 0 0 0 过河方案(1为同时过两商人2为过一商一下3为过两下人
    4 5 2 5 4 0 0 0 0 返回方案123同上,4返回一商5返一下人

先过一商一仆,返回一商;过两仆人,返回一仆人;过两商人,返一商一仆;过二商,回一仆;过两仆回一商;过一商一仆。完.
发表于 2003-8-20 04:40:03 | 显示全部楼层
不知道还有没有人来看我的程序....
发表于 2003-8-20 08:35:57 | 显示全部楼层
不过这个程序也太长了吧。
这本来把它的图论解法用程序实现也不用这么长啊
发表于 2003-8-21 00:29:30 | 显示全部楼层
那用matlab怎么编啊,我已经写个差不多了,但有一步编不出来,就是在用FOR的多重循环中,用什么语句中途返回到任何一个上层,而不执行后面的程序。希望高手们相助。
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 05:27 , Processed in 0.053155 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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