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格式。
/*
解题报告: 以第一列为起始点,第二列为第一天........第m列为第m-1天。
对每一行单独处理。每一行每一列的数字都不相同。
*/
//标程:
#include<stdio.h>
#include<string.h>
#include<math.h>
int n,vis[1100][1100],p[1100][1100],m;
int f(int x,int y,int i)
{
int j;
for(j=1;j<=x;j++)
if(p[j][y]==i) return 0;
return 1;
}
void dfs(int x,int y)
{
int i;
for(i=1;i<=m;i++)
{
if(!vis[x][i] && f(x,y,i))
{
p[x][y]=i;
vis[x][i]=1;
dfs(x,y+1);
}
}
}
int main() { //freopen("a.txt","r",stdin); int t,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(p,0,sizeof(p)); memset(vis,0,sizeof(vis)); m=(int)pow(2.0,n); for(i=1;i<=m;i++) { p[i][1]=i; vis[i][i]=1; dfs(i,2); } for(i=1;i<=m;i++) { for(j=1;j<=m;j++) printf("%3d",p[i][j]); printf("\n"); } } return 0; }