循环比赛日程表

描述

 

设有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 }
View Code
原文地址:https://www.cnblogs.com/qq-1585047819/p/11243912.html