循环赛日程表
有n个选手,每个选手与其他n-1个选手各赛一场,每个选手一天只能赛一场
当n为偶数,比赛n-1天,当n为奇数,比赛n天
要求设计满足以上要求的比赛日程表
课本一般用递归分治的算法来解循环赛日程表的问题,
对n为奇数时的复制不清楚
#include "stdio.h"
#include "conio.h"
int a[100][100]={0}; /*数组a为全局变量*/
int b[100]={0};
/*n为偶数复制*/
void copy(int n)
{
int i,j,m=n/2;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
a[i][j+m]=a[i][j]+m; /*左下角相对左上角同列元素加n/2*/
a[i+m][j]=a[i][j+m]; /*右上角复制左下角*/
a[i+m][j+m]=a[i][j]; /*右下角复制左上角*/
}
}
/*n为奇数复制*/
void copyodd(int n)
{
int i,j,m=n/2;
for(i=0;i<m;i++)
{
b[i]=m+i;b[m+i]=b[i];
}
for(i=0;i<m;i++)
{
for(j=0;j<m+1;j++)
{
if(a[i][j]>m){a[i][j]=b[i];a[m+i][j]=(b[i]+m)%n;}
else a[m+i][j]=a[i][j]+m;
}
for(j=1;j<m;j++)
{
a[i][m+j]=b[i+j-1];
a[b[i+j-1]][m+j]=i;
}
}
}
/*复制函数*/
void makecopy(int n)
{
if(n/2>1&&n%2==1)copyodd(n);
else copy(n);
}
/*划分函数*/
void tournament(int n)
{
if(n==1){a[0][0]=1;return;}
else if(n%2==1){tournament(n+1);return;}
tournament(n/2);
makecopy(n);
}
void main()
{
int i,j,n=10;
tournament(n);
for(i=0;i<n;i++) /*输出日程表*/
{
for(j=0;j<n;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
getch();
}