w【问题描述】
w 设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。
w 输入:M
w 输出:表格形式的比赛安排表
w【样例输入】match.in
w 3
w【样例输出】match.out
w 1 2 3 4 5 6 7 8
w 2 1 4 3 6 5 8 7
w 3 4 1 2 7 8 5 6
w 4 3 2 1 8 7 6 5
w 5 6 7 8 1 2 3 4
w 6 5 8 7 2 1 4 3
w 7 8 5 6 3 4 1 2
w 8 7 6 5 4 3 2 1
1 #include<cstdio> 2 const int MAXN=33,MAXM=5; 3 int matchlist[MAXN][MAXN]; 4 int m; 5 int main() 6 { 7 printf("Input m:"); 8 scanf("%d",&m); 9 int n=1<<m,k=1,half=1; // 1<<m 相当于 2^m 10 matchlist[0][0]=1; 11 while (k<=m) 12 { 13 for (int i=0;i<half;i++) //构造右上方方阵 14 for (int j=0;j<half;j++) 15 matchlist[i][j+half]=matchlist[i][j]+half; 16 for (int i=0;i<half;i++) //对称交换构造下半部分方阵 17 for (int j=0;j<half;j++) 18 { 19 matchlist[i+half][j]=matchlist[i][j+half]; //左下方方阵等于右上方方阵 20 matchlist[i+half][j+half]=matchlist[i][j]; //右下方方阵等于左上方方阵 21 } 22 half*=2; 23 k++; 24 } 25 for (int i=0;i<n;i++) 26 { 27 for (int j=0;j<n;j++) 28 printf("%4d",matchlist[i][j]); 29 putchar(' '); 30 } 31 return 0; 32 }