微软过桥问题与测试人员素养

微软面试题过桥问题在IT业内几乎已变成一个众所周知的问题,问题如下:
        4个人在晚上过一座小桥,过桥时必须要用到手电筒,只有一枚手电筒,每次最多只可以有两人通过(人多了桥支撑不住就塌了), 4个人的过桥速度分别为1分钟、2分钟、5分钟、10分钟,试问最少需要多长时间4人才可以全部通过小桥?
        一般人碰到这道题目也许马上就在想该如何安排这4个人的过桥顺序使得过桥时间最少,稍微聪明一些的人也许马上就想到了答案:“先让1、2过去,1回来,5、10再过去,2回来,1、2再过去”,总共需要17分钟就可以让4个人都过去。
        当然如果数学知识足够好的话,可能会用图论来分析这个问题,最后发现这是一个图论的最短路径算法问题,只要根据过桥的状态建立一张有向图,然后求出最短路径就可以得到最少时间的过桥方案。(如果读者对如何用图论问题解这个问题感兴趣的话,可以看我的博客中的另外一篇讲微软过桥问题图论解法的文章)。
       
        现在如果让一个测试人员来回答这个问题的话,是不是也象上述一样回答就可以了呢?如果能在很短时间内象上面一样回答问题,当然说明你人比较聪明,但是如果作为测试人员的话,需要的不是简单的结果,而是要全面分析问题,仅仅回答出最短时间为17分钟的答案是达不到测试人员的要求的。
        作为一个测试人员,首先得对问题中的许多未知因素提出疑问,下面一些问题也许是测试人员所想知道的:
1        这4个人为什么要在晚上过这座桥,他们是在正常回家的路上还是野外探险迷路还是被人追杀?如果是被人追杀会不会有2人过去后独自逃走不回来接剩下的2人?
2        这四个人过桥的时间为什么差距这么大,最大最小时间差了10倍?进而可以提出疑问,这4个人到底是什么样的人?他们的年龄分别多大?他们是否有人是残疾人或是小孩?如果有小孩或残疾人的话,那么是不是残疾人和小孩不能同时过桥?(也就是说5和10不能同时过桥)
3       既然最多只有2人可以同时过桥,那么桥的最大承重能力是多少?是不是两个最重的人也可以同时过桥?
4       手电筒是不是好的,手电筒里的电是不是用完了,或者手电筒的电还能用多久?或者过桥的过程中手电筒会不会掉到桥下去或摔坏?
5        当时的天气是什么样的?有没有刮风下雨、打雷或下暴雪,会不会有人在过桥过程中被风刮下桥去,或者被打雷声吓得掉下桥去。或者过桥时天气变坏使得他们过桥需要的时间增加了。
6       当时的气温是多少度?如果温度低于0度的话,桥上是不是结冰了,过桥时会不会滑下去。
7        过桥的过程中对面是不是有救援人员来了,比如1、2过去后就碰到救援人员等在对岸,那么1也许可以拿救援人员的电筒过去接剩下的两个人,这样最少只要14分钟就可以过桥了。
8        过桥的过程中是否有山洪爆发或水突然涨高将桥淹没?
9        会不会在过桥过程中有野兽嚎叫等因素影响他们的过桥速度?
10        桥下面是什么?是水溪还是无水的沟谷还是很深的悬崖?人掉下去后能不能爬上来?
11        桥旁边有没有其他的捷径可以过去。
12        1分钟的人是否可以背上10分钟的人过桥?如果可以的话需要多长时间?
13        桥有多长?手电筒能照多远?是否过去的人在桥的另外一头就可以用手电筒照亮桥让未过去的人过桥?
        这些问题的确定对过桥需要的最短时间都会有影响,在不同的情况下过桥所需要的最短时间是不同的。以上只是写出了一些问题,还有更多的问题读者可以自己去发掘,如果能在上面的基础上再发掘出2个以上的新问题的话,那么相信你已经具备了测试人员全面分析问题的素养了。
        不过即使你不能发现新的问题,并且上面的那些问题你很多都没有想到,也没有任何关系,当学完后面第3章的测试用例设计方法后再来重新分析这个问题,也许你会惊喜地发现你已经有能力发现很多新的问题了。
当然初学者也许会觉得有些问题好像是在钻牛角尖,但是作为测试人员来讲,要的就是这种钻牛角尖的精神。
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 过桥问题是一个经典的计算机科学问题,可以使用Python来解决。 首先,我们需要先了解问题的背景和规则: 假设在一个夜晚,4个人需要过一座桥,过桥的时候需要一盏灯照明,每个人的速度不同,第一个人需要1分钟过桥,第二个人需要2分钟,第三个人需要5分钟,第四个人需要10分钟。现在有一盏灯,每次只能由1人或2人带着过桥,两个人一起走时,速度和时间按照走得慢的那个人来计算。请问最快多少时间可以让他们全部过桥? 下面是一个使用Python解决过桥问题的具体实现: ```python import itertools def calculate_time(persons): # 计算一组人过桥的时间 time = 0 for p in persons: time = max(time, p) return time def cross_bridge(persons): # 计算所有人过桥的最小时间 n = len(persons) min_time = float('inf') for i in range(1, n + 1): for group in itertools.combinations(persons, i): # 一人过桥 if len(group) == 1: time = calculate_time(group) # 两人过桥 else: t1 = max(group) t2 = min(group) time = t1 + t2 # 更新最小时间 if time < min_time: min_time = time return min_time persons = [1, 2, 5, 10] print(cross_bridge(persons)) # 输出最小时间 ``` 在这个代码中,我们使用了Python的itertools模块中的combinations函数来枚举所有人过桥的方案,然后计算每个方案的时间,最后返回所有方案中最小的时间。 注意,这个算法只适用于人数较少的情况,如果人数很多,那么计算量会非常大,这时需要使用更加高效的算法来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值