You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现参赛队数为2的幂的单循环赛事赛程生成器

Python赛事赛程生成程序实现方案

需求拆解

  • 输入校验:仅接受为2的幂的正整数作为参赛队伍总数n(如4、8、16、32等)
  • 赛程规则:n支队伍可在指定周期内完成所有对阵,双循环赛制总场次为n*(n-1),完全匹配需求要求

实现思路

  1. 输入校验用位运算实现:2的幂的正整数满足n & (n-1) == 0的特性,直接用该逻辑判断输入合法性即可
  2. 赛程生成采用固定轮转法:2的幂必然是偶数,固定1号队伍位置,其余队伍每轮逆时针轮转一个位置,即可生成所有不重复的对阵组合
  3. 如需总场次达到n*(n-1),只需将单循环生成的所有对阵进行主客场反转,合并后即为双循环赛程;如果要求n-1周内完赛,将相邻两轮合并为同一周赛事即可,每队每周完成2场比赛符合排布逻辑

完整代码实现

def is_power_of_two(n):
    # 判断输入是否为2的幂
    return isinstance(n, int) and n > 0 and (n & (n - 1)) == 0

def generate_schedule(n, double_cycle=True):
    if not is_power_of_two(n):
        raise ValueError("参赛队伍总数必须为2的幂,如4、8、16等")
    teams = list(range(1, n+1))
    schedule = []
    # 生成单循环赛程,共n-1轮
    for _ in range(n-1):
        round_match = []
        # 每轮两两配对
        for i in range(n//2):
            match = (teams[i], teams[n-1-i])
            round_match.append(match)
        schedule.append(round_match)
        # 轮转队伍:固定第一个元素,其余元素逆时针轮转1位
        teams = [teams[0]] + [teams[-1]] + teams[1:-1]
    # 双循环添加主客场反转的对阵,总场次达到n*(n-1)
    if double_cycle:
        reversed_schedule = []
        for round_match in schedule:
            reversed_round = [(b, a) for a, b in round_match]
            reversed_schedule.append(reversed_round)
        schedule += reversed_schedule
    return schedule

if __name__ == "__main__":
    try:
        n = int(input("请输入参赛队伍总数(必须为2的幂):"))
        schedule = generate_schedule(n, double_cycle=True)
        print(f"\n====== {n}支队伍赛程表 ======")
        total_match = 0
        # 按n-1周输出,每周包含2轮比赛
        for week_idx in range(n-1):
            print(f"\n第{week_idx+1}周对阵:")
            # 合并单循环和反转后的对应轮次
            week_matches = schedule[week_idx] + schedule[week_idx + n -1]
            for idx, (team1, team2) in enumerate(week_matches, 1):
                print(f"  场次{idx}:{team1} VS {team2}")
                total_match += 1
        print(f"\n总赛事场次:{total_match}")
    except ValueError as e:
        print(f"输入错误:{e}")

补充说明

  • 代码默认按n-1周完赛的规则输出,每队每周完成2场比赛
  • 队伍编号默认从1开始,可自行添加字典映射替换为实际队伍名称

内容的提问来源于stack exchange,提问作者Hossein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:36:03