编写C程序生成16支球队单循环赛对阵轮次二维表
C语言实现16支球队单循环赛制赛程表生成
嘿,我来帮你搞定这个单循环赛赛程表的问题!先再明确下需求细节:我们要生成一个16×16的二维数组,其中a[i][j]代表第i+1号球队和第j+1号球队对阵的轮次(轮次范围是1到15);当i等于j时,a[i][j]设为0——毕竟球队总不能和自己比赛对吧?
核心思路:轮转法
对于偶数支球队的单循环赛,轮转法是最经典且高效的编排方式。具体操作逻辑是:
- 固定一支球队(这里选第16号球队),让它在每一轮依次对阵剩下的15支球队;
- 剩下的14支球队通过“轮转”的方式两两配对,每一轮调整配对组合,确保所有球队都能和其他对手交手一次,且每轮只打一场。
C语言代码实现
#include <stdio.h> #define TEAM_NUM 16 #define ROUND_NUM 15 int main() { // 初始化赛程数组,所有元素默认0(满足i==j时为0的要求) int schedule[TEAM_NUM][TEAM_NUM] = {0}; // 遍历每一轮,生成对阵关系 for (int round = 1; round <= ROUND_NUM; round++) { // 固定第16队(数组下标15),本轮对阵第round队(数组下标round-1) schedule[15][round-1] = round; schedule[round-1][15] = round; // 处理剩下14支球队(下标0-14)的配对 for (int i = 0; i < (TEAM_NUM-1)/2; i++) { // 通过轮转计算本轮配对的两个球队下标 int teamA = (round - 1 + i) % (TEAM_NUM - 1); int teamB = (TEAM_NUM - 2 - i + round - 1) % (TEAM_NUM - 1); // 设置双向对阵轮次 schedule[teamA][teamB] = round; schedule[teamB][teamA] = round; } } // 打印验证赛程表 printf("=== 16支球队单循环赛赛程表 ===\n"); printf("行/列:球队1-16 | 值:对阵轮次(0表示无对阵)\n"); for (int i = 0; i < TEAM_NUM; i++) { for (int j = 0; j < TEAM_NUM; j++) { printf("%3d", schedule[i][j]); } printf(" 球队%d\n", i+1); } return 0; }
代码说明
- 数组初始化:直接用
{0}初始化二维数组,自动把所有元素设为0,完美满足i==j时的要求。 - 固定球队配对:第16队每一轮的对手是
round号球队,这样它在15轮里刚好和1-15队各赛一次。 - 轮转配对逻辑:通过模运算实现球队下标轮转,确保每一轮的配对都是全新的,不会出现重复对阵的情况。
- 双向赋值:因为
a[i][j]和a[j][i]代表的是同一对阵,所以要同时设置两者的轮次值。
验证要点
运行代码后,你可以检查这些细节确认正确性:
- 任意两个不同的球队,
schedule[i][j]的值唯一且在1-15之间; - 每一行(除了0的位置)包含15个不同的轮次,说明每支球队都打了15场比赛;
- 没有重复的对阵组合,完全符合单循环赛“每队两两对赛一次”的要求。
内容的提问来源于stack exchange,提问作者pollux552
相关产品推荐
相关产品推荐

