循环比赛日程表
Description
设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。
Input
输入正整数M。
Output
表格形式输出比赛安排表。(整数之间用空格隔开,详见样例)
第一行输出n个数,表示选手的编号。
后面紧接n-1行,每行表示一天的比赛安排。
Sample Input
3
Sample Output
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAX_N=2e2;
int a[MAX_N][MAX_N];
//分左上,左下,右上,右下
//规律很多
int main(){
int M,n,t;
while(scanf("%d",&M)!=EOF){
n=1;
a[1][1]=1; a[1][2]=2;
a[2][1]=2; a[2][2]=1;
while(n<=M){
t=1<<n;
for(int i=1;i<=t;i++){
for(int j=1;j<=t;j++){
//右上
a[i][j+t]=a[i][j]+t;
//左下
a[i+t][j]=a[i][j]+t;
//右下
a[i+t][j+t]=a[i][j];
}
}
n++;
}
t=1<<M;
for(int i=1;i<=t;i++){
for(int j=1;j<t;j++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][t]);
}
}
return 0;
}