编程解决过河问题
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;
}
一天夜晚,有四个人要过一条河,河上有一座只能承受两人重量的桥,而且桥面路况很差,要手持手电筒才能顺利通过。四人单独过河的时间分别为: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;
}
相关文章推荐
- 用编程解决过河问题
- 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
- 第八章解决树和森林的编程问题
- 一个关于解决序列化问题的编程技巧
- Java 编程技术中汉字问题的分析及解决
- Windows下用PostThreadMessage解决网络编程中线程间通讯的问题
- 程序启动冲出UAC-解决Win UAC问题的编程经验
- 编程利器:Sublime Ttext的安装与配置-解决中文输入问题
- myeclipse连接hadoop集群编程及问题解决
- RCP编程技巧:Eclipse rcp运行时报错java.lang.RuntimeException: 问题的解决
- 用编程的思路模拟解决脑筋急转弯问题
- 网络编程中常见问题以及解决思路
- 解决putty终端中显示linux系统中C编程使用curses中文乱码的问题
- iOS网络编程-解决iCloud文档存储过程中文档冲突问题
- 在编程的世界中,如何高效地学习理论知识,应用理论知识来解决实际生产中的问题
- android编程问题和解决方法
- 编程解决实际问题--预测比赛结果,确定凶手
- Java编程能力强化——狼羊过河问题
- Java 编程技术中汉字问题的分析及解决
- 8步帮你解决面试遇到的编程问题