設有n=2k個選手參加比賽,要求設計一個滿足一下要求的比賽日程表:
(1)每個選手必須與其他的n-1個選手個比賽一次;
(2)每個選手每天只能賽一次 。
(3)循環賽一共進行n-1天
設計一個比賽日程表,該表有n行和n-1列,第i行j列為第i個選手第j天遇到的選手
#include<stdio.h>
#include<math.h>
int a[100][100];
void match(int k)
{
int n,temp,i,j;
n=2; //k=0兩個參賽選手日程可以直接求得
a[1][1]=1;
a[1][2]=2;
a[2][1]=2;
a[2][2]=1;
for(i=1; i<k; i++) //迭代處理,依次處理2^n....2^k個選手的比賽日程
{
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");
}
}
int main()
{
int k;
scanf("%d",&k);
if(k!=0)
match(k);
}