如何用Python实现参赛队数为2的幂的单循环赛事赛程生成器
Python赛事赛程生成程序实现方案
需求拆解
- 输入校验:仅接受为2的幂的正整数作为参赛队伍总数n(如4、8、16、32等)
- 赛程规则:n支队伍可在指定周期内完成所有对阵,双循环赛制总场次为
n*(n-1),完全匹配需求要求
实现思路
- 输入校验用位运算实现:2的幂的正整数满足
n & (n-1) == 0的特性,直接用该逻辑判断输入合法性即可 - 赛程生成采用固定轮转法:2的幂必然是偶数,固定1号队伍位置,其余队伍每轮逆时针轮转一个位置,即可生成所有不重复的对阵组合
- 如需总场次达到
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
相关产品推荐
相关产品推荐

