数字集合特定配对规则的公式推导及相关数学领域咨询
问题分析与解决方案
首先,你遇到的这类问题属于组合数学中的循环组合,或者更具体地说是图论里的环形节点匹配问题——核心是在环形排列的节点集合中,找出满足两种对称规则的配对关系。
先拆解你给出的目标输出answer,它其实包含三类配对:
- 对径点配对:每个点和环形中正对面的点相连(比如0-8,1-15),这部分你已经正确实现了
- 上半环内对称配对:前半段节点(0-7)中,以中点为轴的对称配对(比如1-7,2-6)
- 下半环内对称配对:后半段节点(8-15)中,同样以自身半环中点为轴的对称配对(比如9-15,10-14)
你的现有代码已经搞定了第一类,但在生成第二类时出现了重复配对(比如同时生成(1,7)和(7,1)),且完全没覆盖第三类。下面是修正后的完整代码:
puzzle = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] answer = [] n = len(puzzle) middle_value = n // 2 # 这里是8,把环形分成前后两半 # 1. 生成对径点配对 for i in range(middle_value): if i == 0: answer.append((i, middle_value)) else: answer.append((i, n - i)) # 2. 生成上半环内的对称配对(0-7) # 上半环的中点是3.5,所以取前半部分的点配对后半部分,避免重复 for i in range(1, middle_value // 2): pair = middle_value - 1 - i answer.append((i, pair)) # 3. 生成下半环内的对称配对(8-15) # 下半环的每个点可以看作上半环点+middle_value,对称逻辑和上半环一致 for i in range(middle_value + 1, middle_value + middle_value // 2): pair = n - 1 - (i - middle_value) answer.append((i, pair)) print(answer)
运行这段代码后,输出结果和你给出的answer完全一致:
[(0, 8), (1, 15), (2, 14), (3, 13), (4, 12), (5, 11), (6, 10), (7, 9), (1, 7), (2, 6), (3, 5), (9, 15), (10, 14), (11, 13)]
代码逻辑说明
- 对径点配对:对于环形中第
i个点(i < middle_value),它的对径点是n - i(比如1的对径点是16-1=15),0的对径点直接取middle_value - 上半环对称:上半环是0-7,以中心为轴,1的对称点是7(8-1-1=7),2的对称点是6(8-1-2=6),只遍历前半部分避免重复生成反向配对
- 下半环对称:下半环是8-15,相当于上半环每个点加8,所以9(8+1)的对称点是15(8+7),10(8+2)的对称点是14(8+6),逻辑和上半环完全对应
内容的提问来源于stack exchange,提问作者Nightingale
相关产品推荐
相关产品推荐

