用C语言程序进行比赛日程排列
#include <stdio.h>
#define MAXN 64
int a[MAXN+ 1][MAXN +1] = {0}; // 定义全局的数组,最多安排64个选手的比赛日程
void gamecal(int k, int n)// 定义赛程安排的函数,k表示需要安排的选手起始的序号 n表示需要安排选手的数量
{ // 若k为1,n为4表示四个选手排序,从第1个起。
int i, j;
if(n == 2) // n== 2 ,两位选手 直接安排赛程。
{
a[k][1] = k; // 参赛选手编号
a[k][2] = k+1; // 对阵选手的编号
a[k+1][1] = k+1; //参赛选手编号
a[k+1][2] = k; // 对阵选手编号
}
else
{ // 若不是2个选手。
gamecal(k,n/2); // 分治 举例: 若此时k=1,n=4 ,排1,2选手
gamecal( k + n/2, n/2); // 分治 安排3,4选手
for( i = k; i< k+n/2; i++)// 合并 填充右上角
{
for(j = n/2+1; j<=n; j++)
{
a[i][j] = a[i +n/2][j - n/2];
}
}
for( i = k+n/2; i< k+n; i++)// 合并 填充左下角
{
for(j = n/2+1; j<=n; j++)
{
a[i][j] = a[i - n/2][j - n/2]; // a[i + n/2][j - n/2] ——> a[i - n/2][j - n/2]
}
}
}
}
int main()
{
int m,i,j;
printf("输入参赛选手人数: ");
scanf("%d",&m) ;
j = 2; //定义为2的整数幂
for(i=2;i < 8; i++)
{
j = j*2;
if(j == m)
break;
}
if(i >= 8)
{
printf("参赛选手必须为2的整数次幂,且不超过64! \n");
getch();
return 0;
}
gamecal(1,m);
printf("\n编号 ");
for (i = 2; i<=m; i++)
printf("%2d天",i-1);
printf("\n");
for(i = 1;i<= m; i++)
{
for(j = 1; j<= m; j++)
printf("%4d", a[i][j]);
printf("\n");
}
getch();
return 0;
}