循环比赛日程表

来源:互联网 发布:平面图设计软件下载 编辑:程序博客网 时间:2024/04/30 07:58

Problem Description

设有N个选手进行循环比赛,其中N=2^M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。

Input

输入第一行为T,表示数据组数,对于每组数据就一个M(1<=M<=10)。

Output

对于每组输入的M,输出表格形式的比赛安排表

Sample Input

13

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  1Hint 输出每个数用%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;}
原创粉丝点击