社区
新手乐园
帖子详情
求助过桥问题
haoxie8
2006-07-05 03:00:27
五人一灯,五个人的速度分别为s1,s2,s3,s4,s5,
在晚上要过一座 最多同时通过两人 的独木桥(经过桥上时必须要有灯),
怎么样才能算出所有人过桥需要的最短时间?
...全文
540
21
打赏
收藏
求助过桥问题
五人一灯,五个人的速度分别为s1,s2,s3,s4,s5, 在晚上要过一座 最多同时通过两人 的独木桥(经过桥上时必须要有灯), 怎么样才能算出所有人过桥需要的最短时间?
复制链接
扫一扫
分享
转发到动态
举报
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)
大班语言小熊过桥 PPT课件.pptx
大班语言小熊过桥 PPT课件.pptx
汽车租赁协议书《公司租个人》(1).doc
汽车租赁协议书《公司租个人》(1).doc
2020年国家开放大学电大专科《信息技术与教育技术(1)》网络课网考形考大作业试题及答案.pdf
2020年国家开放大学电大专科《信息技术与教育技术(1)》网络课网考形考大作业试题及答案.pdf
30秒独木桥模型matlab,matlab7.0 for 循环优化(转换为向量形式)紧急
求助
。
各位同学们好,最近在学习matlab编程,但是在for循环这里出了问题,主要就是效率的问题,写好的一个for循环要运行2分钟30秒之久,于是想要改进程序希望能够运行速度更快一点,也差了一些资料。提高for循环的效率的主要方法就是1提前给变量预村变量的空间,用ones 和zeros函数先定义变量的大小。2尽量避免用for循环,将其改成等价的向量形式。对第一点比较简单,我也做了一些改善,对于第二点,我...
趣味数学(各大经典数学问题)
哥尼斯堡七桥问题 18世纪在哥尼斯堡城(今俄罗斯加里宁格勒)的普莱格尔河上有7座桥,将河中的两个岛和河岸连结,如图1所示。城中的居民经常沿河过桥散步,于是提出了一 个问题:能否一次走遍7座桥,而每座桥只许通过一次,最后仍回到起始地点。这就是七桥问题,一个著名的图论问题。 这个问题看起来似乎不难,但人们始终没有能找到答案,最后问题提到了大数学家欧拉那里。欧拉以深邃的洞察力很...
新手乐园
33,322
社区成员
41,775
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章