求助过桥问题

haoxie8 2006-07-05 03:00:27
五人一灯,五个人的速度分别为s1,s2,s3,s4,s5,
在晚上要过一座 最多同时通过两人 的独木桥(经过桥上时必须要有灯),

怎么样才能算出所有人过桥需要的最短时间?
...全文
540 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
LuoMuFeng 2006-07-06
  • 打赏
  • 举报
回复
不过经本人再三考虑,还是觉得不用搞得如此复杂。应该像这样:

为了便于描述,我们给所有的人取一名字,走得最快的叫“老大”,第二快的叫“老二”,依次类推。


现在假如有十个人要过桥:

首先,老大和老二结伴过桥,然后老大返回;
接着,老十和老九结伴过桥,然后老二返回;
这样就把老十和老九送过了桥。

重复上面的过程,把老八和老七送过去:
老大和老二结伴过桥,然后老大返回;
老八和老七结伴过桥,然后老二返回;

如此重复多次,即可以最快的速度过桥。
LuoMuFeng 2006-07-06
  • 打赏
  • 举报
回复
郁闷啊。没仔细考虑。我有罪啊!
「已注销」 2006-07-06
  • 打赏
  • 举报
回复
tailzhou(尾巴)

谢谢,试验了一下,程序结果是正确的,先结了再慢慢消化
「已注销」 2006-07-06
  • 打赏
  • 举报
回复
LuoMuFeng(罗穆峰) ( ) 信誉:100 2006-7-6 8:58:38 得分: 0

找出其中走得最快的人,我们不妨称他为“甲”。
首先由“甲”拿着手电筒,护送任意一个人过桥,然后“甲”再带着手电筒回来,护送另一个人过桥。如此反复四次(最后一次不用回来了),问题就解决了。


哈哈,你说的这个绝对不是最快的,要考虑到把速度较慢的人组合在一起过桥,节省时间,然后速度快的送灯回来



tailzhou 2006-07-06
  • 打赏
  • 举报
回复
to LuoMuFeng(罗穆峰)
你想的太简单了。

假设5人,过桥需用时分别为1,2,3,100,101;
按你的说法需要时间101+100+3+2+3*1=209

以下为我的程序的执行结果:
D:\projects\cl>test
the number of person is:5
the times is:1 2 3 100 101
the time is:112
the proc is:
1: 0 1 go 0 back;
2: 0 2 go 0 back;
3: 3 4 go 1 back;
4: 0 1 go 1717787756 back;
按上面的走法只要时间112就可以了。
powersuite 2006-07-06
  • 打赏
  • 举报
回复
mark
LuoMuFeng 2006-07-06
  • 打赏
  • 举报
回复
干嘛写那么长的程序?如果真的是我说的那个意思,那这个问题真是太简单了,方法如下:

找出其中走得最快的人,我们不妨称他为“甲”。
首先由“甲”拿着手电筒,护送任意一个人过桥,然后“甲”再带着手电筒回来,护送另一个人过桥。如此反复四次(最后一次不用回来了),问题就解决了。
tailzhou 2006-07-05
  • 打赏
  • 举报
回复
调试了好久,不知道还有没错误;

#include <stdio.h>

int num; //人数
int sum; //需要的最小时间
int *sp; //每个人过桥需要的时间
int *rst; //最小时间的走法
int *prc; //保存临时的走法

void fh(int lft,int ip,int tm);

/*
在没过桥的人中任取两人过桥
lft表示尚未过桥的人数,
ip保存过桥的状态,
tm表示到该步的已使用时间
*/
void gq(int lft,int ip,int tm)
{
int i,j;
if (tm>sum) return;
for (i=0;i<num;++i)
{
if (ip & 0x1<<i) continue;

for (j=i+1;j<num;++j)
{
if (ip & 0x1<<j) continue;
prc[(num-lft)*3]=i;
prc[(num-lft)*3+1]=j;

//lft放到fh函数内处理,以便prc的统一处理
fh(lft,(ip | 0x1<<i) | 0x1<<j,tm+(sp[i]>sp[j]?sp[i]:sp[j]));
}
}
}

/*
在已过桥的人中任取一人返回
lft表示尚未过桥的人数,
ip保存过桥的状态,
tm表示到该步的已使用时间
*/
void fh(int lft,int ip,int tm)
{
int i;
if (tm>sum) return;

if (lft==2) //当只剩下2人的时候,一次过,完成一个走法,其实应该在gq内处理,为了方便处理,放到这里
{
//for (i=0;i<num-1 ;++i )
//{
// printf("%d: %d %d go %d back;\n",i+1,prc[i*3],prc[i*3+1],prc[i*3+2]);
//}
//printf("*************the time is %d\n",tm);
if (tm<sum) //如果是一个更优的走法,保存
{
sum=tm;
for (i=0; i<3*num; ++i) rst[i]=prc[i];
}
return;
}

for (i=0;i<num;++i)
{
if (!(ip & 0x1<<i)) continue;
prc[(num-lft)*3+2]=i;
gq(lft-1,ip ^ 0x1<<i,tm+sp[i]);
}
}

int main()
{
int i;
printf("the number of person is:");
scanf("%d",&num); //本程序最多支持31人

printf("the times is:"); //输入不要求排序,源题为速度,为方便处理,本程序要求输入时间.
sp=(int*)malloc(sizeof(int)*num);
prc=(int*)malloc(sizeof(int)*num*3);
rst=(int*)malloc(sizeof(int)*num*3);
sum=0;
for (i=0;i<num ;++i )
{
scanf("%d",sp+i);
sum+=sp[i];
}
sum+=3*sp[0]+1; //给sum初始化一个最大值

gq(5,0,0);

printf("the time is:%d\n",sum);
printf("the proc is:\n");
for (i=0;i<num-1 ;++i )
{
printf("%d: %d %d go %d back;\n",i+1,rst[i*3],rst[i*3+1],rst[i*3+2]);
}
}
Arqui 2006-07-05
  • 打赏
  • 举报
回复
大航海时代里遇到过
「已注销」 2006-07-05
  • 打赏
  • 举报
回复
crazy_lazy_pig(疯狂懒猪)
我说的是“经过桥上时必须要有灯”,不要在这些小文字上纠缠啦~

tailzhou(尾巴) :过的时候,任意取两人,回的时候任意取一人;
怎么个任意法?穷举要遍历所有的可能性啊
tailzhou 2006-07-05
  • 打赏
  • 举报
回复
用回溯;
过的时候,任意取两人,回的时候任意取一人;
tailzhou 2006-07-05
  • 打赏
  • 举报
回复
如果crazy_lazy_pig(疯狂懒猪)说的可以,
那么可不可以在桥上交换灯?

哈哈。
crazy_lazy_pig 2006-07-05
  • 打赏
  • 举报
回复
题目还是有问题啊:“桥上必须有灯”是什么意思?可不可以一个人走到一半,在桥中间等着下一个来啊?
「已注销」 2006-07-05
  • 打赏
  • 举报
回复
tailzhou(尾巴)

我也是考虑穷举,但是不知道怎么实现
tailzhou 2006-07-05
  • 打赏
  • 举报
回复
我觉得jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!) 的算法有问题:

举个例子:s1--S5分别为1,12,13,14,15;
则t5+t3+t2*3+t1*2=15+13+12*3+1*2=66;

如果走法如下:
1 s1,s2 go,s1 back, spend t2+t1
1 s1,s3 go,s1 back, spend t3+t1
1 s1,s4 go,s1 back, spend t4+t1
1 s1,s5 go spend t5;
用时为t5+t4+t3+T2+3*T1=15+14+13+12+3=57;

我觉得可能需要穷举才成。
「已注销」 2006-07-05
  • 打赏
  • 举报
回复
jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!)

你的给了一个结果,不是算法啊,如果是六个人呢
「已注销」 2006-07-05
  • 打赏
  • 举报
回复
LuoMuFeng(罗穆峰) 没错啊
jixingzhong 2006-07-05
  • 打赏
  • 举报
回复
假设 s1,s2,s3,s4,s5 为有序的,s1最快, s5 最慢(无序就先排序一下)
过桥时间假设对应的 t1 -- t5

1 s1,s2 go,s1 back, spend t2+t1
2 s5,s4 go, s2 back, spend t5+t2
3 s1,s3 go, s1 back, spend t3+t1
4 s1,s2 go,s1 back, spend t2

min_total: t5+t3+t2*3+t1*2 ....
jixingzhong 2006-07-05
  • 打赏
  • 举报
回复
这个问题在 一个 flash 游戏中玩过,
呵呵,
有点 统筹安排 的味道 ...
LuoMuFeng 2006-07-05
  • 打赏
  • 举报
回复
条件没说清楚。我猜想题目应该是:
五个人过桥,每个人的速度都不同,一次最多只能过两个人。只有一只手电筒,每次过桥都必须有带上这只手电筒。求最快的过桥方法。
是不是这样的?如果是,我再帮你做答;如果不是,就免答了。
加载更多回复(1)

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧