intf(" 请输入参赛队伍个数( 2-%d ): ",MAXSIZA); scanf("%d",&m); while(m>MAXSIZA || m<2) { printf(" 输入数据有误,请重新输入参赛队伍个数( 2-%d ): ",MAXSIZA); scanf("%d",&m); } //奇数个选手,虚拟一个选手,使之成为偶数 n=m+m%2; //给选手编号,存储在数组第一列 for(i=0;i<n;i++) a[i][0]=i+1; //生成日程表,将比赛安排存储在数组中 for(i=1;i<n;i++) { for(int j=0;j<n/2;j++) { a[a[j][0]-1][i]=a[(n-1-j)%n][0]; a[a[(n-1-j)%n][0]-1][i]=a[j][0]; } //将数组第一列按将除 n外的选手按顺时针(或逆时针旋转) n/2-1 个位置 int k=0,t;t=a[k][0]; for(;k<n-2;k++) a[(k*(n/2-1))%(n-1)][0]=a[(k+1)*(n/2-1)%(n-1)][0]; a[(k*(n/2-1))%(n-1)][0]=t; } for(i=0;i<n;i++) //输出表头图一顺时针旋转 3个位置 81234 765 图二 84567 321 { if(i==0)printf(" 队号\t"); else printf(" 第%d 天\t",i); } printf("\n"); for(i=0;i<m;i++) //输出日程表{ for(int j=0;j<n;j++) { if(m!=n && a[i][j]==n) //用输出‘-’表示轮空 printf(" -\t"); else printf(" %d\t",a[i][j]) ;} printf("\n"); }} 运行结果如下: