编程解决过河问题

问题是这样的:

一天夜晚,有四个人要过一条河,河上有一座只能承受两人重量的桥,而且桥面路况很差,要手持手电筒才能顺利通过。四人单独过河的时间分别为:2分钟、3分钟、8分钟和10分钟,并且只有一个手电筒。问:四人都过河的最短时间是多少?

大概编程思想是这样的:

(1)从四人中任挑两人过河,记录时间(两人中的慢者所需时间)

(2)让快者返回,记录时间

(3)从三人中任挑两人过河,记录时间(两人中的慢者所需时间)

(4)让快者返回,记录时间

(5)剩下两人过河,记录时间(两人中的慢者所需时间)

(6)求总时间并暂时存储,与下一个总时间比较求小值。直到试遍所有可能的组合,即得到最短时间。

以下是解题程序,都好几年了,现在连自己都看不懂了:(

#include<iostream.h>

static int b[4]={2,3,8,10};
static int a[4];
int num1,num2,time=0,result=100;

int min(int a,int b)
{  return a<b?a:b;  }

int max(int a,int b)
{  return a>b?a:b;  }

int min(int a,int b,int c)
{  a=a<b?a:b; return a<c?a:c;  }

void cross(int m,int n,int k,int r)
{
 int min,x,y,time2;
 time+=max(b[m],b[n]);
 num1=k-2; num2=4-num1;
 
  if(num2==2)
  {
   if(b[m]<b[n]){ min=b[m]; x=m; y=n; }
   else{ min=b[n]; x=n; y=m; }
  }
  
  else
  {
   if(b[m]<b[n]){ min=b[m]; x=m; y=n; }
   else { min=b[n]; x=n; y=m;}
   if(min<b[r]){ a[r]=-1; }
   else { min=b[r]; a[x]=-1; x=r; }
  }
  time+=min;
  num1++;
  if(num1==3)
   time2=time;
  a[x]=0; a[y]=-1;
  if(num1==2)
  {
   min=0;
   for(int k=0;k<4;k++)
    if(a[k]!=-1)
     min=max(min,b[k]); 
   time+=min;
   a[y]=0;
   return;
  }
  for(int i=0;i<3;i++)
   for(int j=i+1;j<4;j++)
   {
    if(a[i]!=-1 && a[j]!=-1)
    {
     cross(i,j,3,y);
     result=result<time?result:time;//result=min(result,time1);
     time=time2;
    }
   }
}

void main()
{
 int i,j;
 int alltime=100;
 for(i=0;i<3;i++)
 {
  for(j=i+1;j<4;j++)
  {
   for(int k=0;k<4;k++)
    a[k]=0;
   time=0;
   cross(i,j,4,0);
   alltime=min(alltime,result);
  }
  
 }
 cout<<"The least time is:"<<alltime<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值