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格式。
#include<iostream> #include<iomanip> // iomanip是I/O流控制头文件 #include<cstdio> using namespace std; int a[1200][1200]; int main() { int i,j,k,m,t,h; while(cin>>t) { while(t--) { cin>>m; k=1; h=1; // h 是当前方阵的大小,也是下一个方阵大小的一半 a[1][1]=1; while(k<=m) // 循环次数不超过m { for(i=1;i<=h;i++) //右上角 for(j=1;j<=h;j++) a[i][j+h]=a[i][j]+h; for(i=1;i<=h;i++) //对称交换 for(j=1;j<=h;j++) { a[i+h][j]=a[i][j+h]; // 左下角=右上角 a[i+h][j+h]=a[i][j]; // 右下角=左上角 } k++; h=h*2; } for(i=1;i<=h;i++) { for(j=1;j<=h;j++) cout<<setw(3)<<a[i][j]; // setw(3)--- >设置域宽为3 cout<<endl; } } } return 0; }