《程序员的算法趣题》-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言。有兴趣的同学,可以购书阅读~
在此更新个人编写的Python版,仅供学习使用。(运行环境:Python3.6)
Q25 鞋带的时髦系法
如图所示的这几种依次穿过 12 个鞋带孔的系法很有名(这里不考虑鞋带穿过鞋带孔时是自外而内还是自内而外)。
这里指定鞋带最终打结固定的位置如图中的前两种系法所示,即固定在最上方(靠近脚腕)的鞋带孔上,并交错使用左右的鞋带孔。
问题
求鞋带交叉点最多时的交叉点个数。譬如 图12 左侧的系法是 5 个,正中间的这种系法是 9 个。
from itertools import permutations
hole_number = 6
max_cross_points = 0
for left_order in permutations([i for i in range(1, hole_number)]):
for right_order in permutations([i for i in range(1, hole_number)]):
path = []
# 从左侧开始
left = 0
for pos in range(len(left_order)):
right = right_order[pos]
path.append((left, right))
left = left_order[pos]
path.append((left, right))
# 右侧结束
path.append((left, 0))
cross_points = 0
for pair in path:
for another_pair in path:
if pair == another_pair:
continue
if pair[0] < another_pair[0] and pair[1] > another_pair[1]:
cross_points += 1
if cross_points > max_cross_points:
max_cross_points = cross_points
print("交叉点个数为:%s" % max_cross_points)
运行结果:
交叉点个数为:45