循环赛日程

该代码使用分治策略生成满足条件的网球循环赛日程表,每个选手与其他所有选手比赛一次,每天最多一场比赛,共进行n-1天。table函数通过递归将大问题分解成小问题解决,print_table函数用于展示生成的日程表。
摘要由CSDN通过智能技术生成
#!/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],两两比赛就行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值