NanKai-OJ1437-校长杯(循环赛日程安排)

来源:互联网 发布:剑网三御姐脸捏脸数据 编辑:程序博客网 时间:2024/05/16 08:28
Font Style: Aa Aa Aa

        在南开大学,一年一度的“校长杯”三大球比赛是广大师生必不可少的一次运动大餐。随着南开大学学校规模的扩大和体育事业的发展,参与校长杯赛事的师生越来越多。竞赛采用的是传统的“循环赛”制,即每队的选手都必须和其他各队选手较量一次。为了竞赛日程安排方便,报名的队伍数n都将是2的k次幂,(0<k<9,且k为自然数)。为了避免参赛师生过于疲劳,竞赛安排每支队伍每天只比赛一次。同时,竞赛一共进行(n-1)天。
      现在,竞赛组委会想请你帮忙设计一个循环赛的日程表,使得竞赛的日程安排满足上述要求。

Input

输入只有一个数k。

Output

请输出一个n行,每行有n个正整数的循环赛日程表。相邻的两个正整数用一个空格隔开。
其中,第i行(0<i<n+1)表示第i队的参赛日程,第1个正整数为i,表示参赛队的队号,后面的(n-1)个正整数表示该队在参赛日程中,依次较量的队号。

Sample Input

1

Sample Output

1 2  
2 1  

 

思路:利用分治的方法解决,只要把n/2的队伍安排好就行了,思路明白了,代码不是很懂啊!

 

#include<stdio.h>
#define N 260
int table[N][N];
void racetable(int k,int n)
{
    int i,j,m,s,t;
    for(i=1;i<=n;i++)
        table[1][i]=i;
    for(s=1,m=1;s<=k;s++)
    {
        n=n/2;
        for(t=1;t<=n;t++)
            for(i=m+1;i<=2*m;i++)
                for(j=m+1;j<=2*m;j++)
                {
                    table[i][j+(t-1)*m*2]=table[i-m][j+(t-1)*m*2-m];
                    table[i][j+(t-1)*2*m-m]=table[i-m][j+(t-1)*m*2];
                }         
   m*=2;
    }
}
void print(int n)
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<n;j++)
            printf("%d ",table[i][j]);
        printf("%d\n",table[i][n]);
    }
}      
int main()
{
     int k,n;
     while(scanf("%d",&k)!=EOF)
     {
        n=1<<k;
        racetable(k,n);
        print(n);
     }
     return 0;
}


原创粉丝点击