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('\n');
30 }
31 return 0;
32 }