循环赛日程表设计
问题描述:设有n=2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表
(1)每个选手必须与其他n-1个选手各赛一场
(2)每个选手一天只能赛一次
(3)循环赛一共进行n-1天
解题思路:首先要明白一个关系,那就是每一张表可以被分成四个子表,直到分成k=1即只有两个人进行比赛时,此时不用再分,两个人比赛日程也显而易见,然后需要找出每个表中四个子表的对应关系,不难发现,左上角在被赋值的情况下,左下角=左上角+2^k-1,右上角=左下角,右下角=左上角,直到这个关系,那么问题就比较简单了。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[9][9];
void table(int k,int a[][9])
{
int i;
if(k>3)
{
return ;
}
int j;
for(i=1;i<=(int)pow(2,k-1);i++)
{
for(j=1;j<=(int)pow(2,k-1);j++)
{
a[i+(int)pow(2,k-1)][j+(int)pow(2,k-1)]=a[i][j];
a[i+(int)pow(2,k-1)][j]=a[i][j]+(int)pow(2,k-1);
a[i][j+(int)pow(2,k-1)]=a[i+(int)pow(2,k-1)][j];
}
}
k++;
return table(k,a);
}
int main()
{
int k=1;
int i,j;
a[1][1]=1;
table(k,a);
for(i=1;i<9;i++)
{
for(j=1;j<9;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
两个人时的比赛日程如下:
1 | 2 |
---|---|
2 | 1 |