《程序员的算法趣题》-(日)增井敏克 Python解题 -- (Q25)

本文介绍了《程序员的算法趣题》中第25题——鞋带的时髦系法,探讨了如何找到交叉点最多的系法。通过Python实现,得出交叉点最多时的数量为45个。
摘要由CSDN通过智能技术生成

《程序员的算法趣题》-(日)增井敏克 , 书中为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值