《程序员的算法趣题》-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言。有兴趣的同学,可以购书阅读~
在此更新个人编写的Python版,仅供学习使用。(运行环境:Python3.6)
Q09 落单的男女
人们聚集在某个活动会场上,根据到达会场的顺序排成一排等待入场。假设你是活动的主办人员,想把人们从队列的
某个位置分成两组。
你想要让分开的两组里每一组的男女人数都均等,但如果到场顺序不对,可能出现无论怎么分,两组都不能男女均等的情况。
举个例子,有 3 位男性、 3 位女性以“男男女男女女 ” 的 顺 序 到 场, 如图所示,无论从队列的那个位置分开,两组的男女人数都不均等。但如果到场顺序为“男男女女男女”,那么只需要在第 4 个人处分组就可以令分开的两组男女人数均等了。
问题
求男性 20 人、女性 10 人的情况下,有多少种到场顺序会导致无论怎么分组都没法实现两组男女人数均等?(原书,感觉有问题!)看原书分析,比较合理的问题应该是:
求男性20人、女性10人的情况下,有多少种到场顺序会导致无论怎么分组都没有任何一组内部男女人数能够均等?
分析图:
问题可简化为:从0点至蓝点,不经过红点,有多少种可能?
利用最短路径的思路:
man_number = 20
female_number = 10
man_number += 1
female_number += 1
array = [[0]*man_number for i in range(female_number)]
array[1][0] = 1
array[0][1] = 1
for man in range(man_number):
for female in range(female_number):
if (man != female) and (man_number-man != female_number-female):
try:
if man > 0:
array[female][man] += array[female][man-1]
if female > 0:
array[female][man] += array[female-1][man]
except IndexError:
pass
result = array[female_number-2][man_number-1] + array[female_number-1][man_number-2]
print("有%s种" % result)
运行结果:
有2417416种