您的位置:首页 > 编程语言

编程解决过河问题

2006-06-21 17:37 337 查看
问题是这样的:

一天夜晚,有四个人要过一条河,河上有一座只能承受两人重量的桥,而且桥面路况很差,要手持手电筒才能顺利通过。四人单独过河的时间分别为: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
);
num1=k-2; num2=4-num1;

if(num2==2)
{
if(b[m]<b
){ min=b[m]; x=m; y=n; }
else{ min=b
; x=n; y=m; }
}

else
{
if(b[m]<b
){ min=b[m]; x=m; y=n; }
else { min=b
; 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: