Problem Description
设有N个选手进行循环比赛,其中N=2^M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。
Input
输入第一行为T,表示数据组数,对于每组数据就一个M(1<=M<=10)。
Output
对于每组输入的M,输出表格形式的比赛安排表
Sample Input
1 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 Hint 输出每个数用%3d格式。
题意:根据示例来看:可以将每一行第一列看成每一位选手,后面的每一列是他需要和第几位选手比赛;
当测试数据为1时:
1 2
2 1
测试数据为2是:
第一步:k=1;
1 2
2 1
第二步:k=2;
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
测试数据为3是:
第一步:k=1;
1 22 1第二步:k=2;
1 2 3 42 1 4 33 4 1 24 3 2 1第三步:k=4;
1 2 3 4 5 6 7 82 1 4 3 6 5 8 73 4 1 2 7 8 5 64 3 2 1 8 7 6 55 6 7 8 1 2 3 46 5 8 7 2 1 4 37 8 5 6 3 4 1 28 7 6 5 4 3 2 1
即每一步向三个方向扩展,即a[i+k][j],a[i][j+k],a[i+k][j+k];
# include<cstdio> # include<iostream> using namespace std; int a[1100][1100]; int main() { //freopen("a.txt","r",stdin); int t; cin>>t; while(t--) { int m; cin>>m; int i,n=1; for(i=0;i<m;i++) n*=2; a[1][1]=1; //赋初始值; int j,k; k=1; while(k<n) { for(i=1;i<=k;i++) { for(j=1;j<=k;j++) { a[i][j+k]=a[i][j]+k; a[i+k][j]=a[i][j]+k; a[i+k][j+k]=a[i][j]; } } k*=2; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%3d",a[i][j]); cout<<endl; } } return 0; }