描述
设有n个选手进行循环比赛,其中n = 2m,要求每名选手要与其他n - 1名选手都赛一次,每名选手每天比赛一次,循环赛共进行n - 1天,要求每天没有选手轮空。
输入
一行,包含一个正整数m(m<=6)。
输出
表格形式的比赛安排表(n行n列),每个选手的编号占三个字符宽度,右对齐。
样例输入
样例输出
提示
以表格的中心为拆分点,将表格分成A、B、C、D四个部分,就很容易看出有A=D,B=C,并且,这一规律同样适用于各个更小的部
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n; 5 int arr[105][105]; 6 7 void dfs(int fi,int ed,int depth){ 8 if(depth==1) return; 9 int half=depth>>1; 10 arr[fi][ed+half]=arr[fi+half][ed]=arr[fi][ed]+half; 11 arr[fi+half][ed+half]=arr[fi][ed]; //先把4个角落给填充了 12 dfs(fi,ed,depth>>1); //谭厚递归到更小的矩形 把4个角落给填充了 13 dfs(fi,ed+(depth>>1),depth>>1); 14 dfs(fi+(depth>>1),ed,depth>>1); 15 dfs(fi+(depth>>1),ed+(depth>>1),depth>>1); 16 } 17 18 int main(){ 19 ios::sync_with_stdio(false); 20 cin>>n; 21 n=pow(2,n); 22 arr[1][1]=1; 23 dfs(1,1,n); 24 for(int i=1;i<=n;i++){ 25 for(int j=1;j<=n;j++){ 26 printf("%3d",arr[i][j]); 27 if(j==n) printf(" "); 28 } 29 } 30 return 0; 31 }