c语言之循环赛算法

来源:互联网 发布:淘宝怎样收藏店铺 编辑:程序博客网 时间:2024/06/07 03:37

设有n=2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表:

    (1).每个选手必须与其他n-1个选手各赛一场

    (2).每个选手一天只能赛一次

    (3).循环赛一共进行n-1天

对于循环赛的计算,如果说吧所有的比赛算出来过于复杂,但是对于2个队伍的比赛我们就可以非常轻松的做出来。

所以说我们将2个队伍的比赛列出来然后进行迭代法吧所有比赛排列出来就可以了。

代码如下:

#include<stdio.h>
#include<math.h>


void xunhuan(int k)
{
    int a[100][100];
    int n,temp,i,j,p,t;
    n=2;
    a[1][1]=1;a[1][2]=2;
    a[2][1]=2;a[2][2]=1;
    for(t=1;t<k;t++)
    {
        temp=n;n=n*2;
        for(i=temp+1;i<=n;i++)
            for(j=1;j<=temp;j++)
            a[i][j]=a[i-temp][j]+temp;
        for(i=1;i<=temp;i++)
            for(j=temp+1;j<=n;j++)
            a[i][j]=a[i+temp][(j+temp)%n];
        for(i=temp+1;i<=n;i++)
            for(j=temp+1;j<=n;j++)
            a[i][j]=a[i-temp][j-temp];
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            printf("%d ",a[i][j]);
            if(j==n)
            printf("\n");
        }
}
void main()
{
    int k;
    printf("比赛选手个数为n(n=2^k),请输入参数K(K>0):\n");
    scanf("%d",&k);
    if(k!=0)
    xunhuan(k);


}