#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/1/8 13:32
# @Author : Lili
# @File : 循环赛日程表.py
# @Description : 设n=2^k个运动员要进行网球循环赛,现设计满足以下要求的比赛日程表
## 每个选手必须与其他n-1个选手各比赛一次
## 每个选手每天只能比赛一次
## 循环赛共进行n-1天
def print_table(a: [[]]):
"""
打印[[]]
:param a:
:return:
"""
i = 0
for ai in a:
print(str(i) + "\t" + str(ai))
i += 1
print("END")
def table(k: int):
"""
生成选手比赛日程表,a[1]表示选手编号“1,2,3,4,5,6,7,8”,a[2:9]表示之后每天对手编号
:param k: 参加2^k名运动员
:return: [[]]列表
"""
n = 2**k
a = []
for i in range(0, n+2):
t_a = [0] * (n + 2)
a.append(t_a)
for i in range(1, n+1):
a[1][i] = i
for l in range(0, k):
for step in range(1, k+1):
step = 2**step
for i in range(1, int(step/2)+1):
for j in range(1, n+1, step):
a[step+1-i][j:j+step] = reversed(a[i][j:j+step])
return a
print_table(table(3))
每两人比赛一次,其实就是生成一个二维表,表的每一行包含1-8,每一列包含1-8,第一列代表本人。
整体采用分治的方法,将a[8][8]划分为a[4][4]再划分为a[2][2],两两比赛就行