2007年7月26日星期四

一道小题目:上楼下楼的人

一栋15层的大楼和15个人。初始状态,15个人随机呆在某一层楼,每层楼只有一个人,然后15个人开始上楼和下楼,初始上楼和下楼的方向是随机的,但当 上楼的和下楼的碰面时,两个人就会改变方向,每个人上一层楼和下一层楼的时间都是一分钟。任何人到达顶楼或者底楼就停止,要多少时间这15个人才能都停止 运动呢?
求这个时间的最大值和最小值!

你要多少种数据结构,多少次循环才能写出这个问题的程序呢!

建议你考虑5分钟再往下看

用程序语言完整的处理这道题
第一步是模拟人上楼下 楼:开两个数组,第一个表示人所在的楼层(0表示没人,1表示有人,整个数组变成0的时候表示所有人都离开了大楼,程序结束),但由于其初始每个人的朝向 是未知的,所以要再开一个表示对应的人的方向,方向的填充要随机生成,每次运行这个程序都会有不同的结果。
第二步就是根据上边的模拟过程,将所有可能的朝向都模拟一遍,然后在结果里求出最大值和最小值。嗯,这个初始状态一共有32768次(2的15次方)。还不错
完美的解决方案,所有的可能都给你包含进去了
以上聪明的程序员的答案
----------聪明人和笨人的分割线-----------------------------------
下边的笨人的方法
每个人见面后往相反的方向运动,速 度不变,那这两个人完全没有区别嘛。我是笨人,我只能用上楼和下楼来区分人,所有上楼的都是一个人,同样所有下楼的都是一个人,那干脆就认为这些家伙不是 人,是些鬼,可以穿过彼此。那最长的时间就是一个鬼从楼顶走到楼底或者楼底走到楼顶的时间(15分钟)最短的时间就是从楼最中间开始走的的时间(8分钟)
笨人写这个程序的结果就是对一个值做个除法操作就搞定了。

当然了,笨人用到的其实是个很有名的定理——高中大家学的动量守恒,想通这一层,那你改变下这些人的初速度了什么的,或者让这些人在任意方向走了什么的,用动量守恒来解决可以帮你去掉很多很多的排列组合。

没有评论: