循环赛日程表问题
实验内容:设你班有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:
1. 每个选手必须与其他n-1个选手各赛一次。
2. 每个选手一天只能参赛一次。
3. 循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表,表的形式和内容如下图所示。在表中的第i行、第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。 实验步骤:
#include
void form(int i,int j,int s);
int a[50][50];
void form(int i,int j,int s)
{int p,q;
if(s=2) /*细分到规模为2的比赛安排*/
{ a[i][s]=j; /*a、此行与对下第四行的值相等*/
a[i][s-1]=i; /*b、此行与对下一行的值相等*/
a[j][s]=i; /*a、b条件共同构造出一个2乘2的矩阵*/
a[j][s-1]=j; }
else
{form(i,i+s/2-1,s/2); /*接着以上思想处理*/
form(i+s/2,j,s/2);
for(q=1;q
for(p=i;p
a[p][q]=a[p-s/2][q-s/2];/*把左下角的数据赋给右上角的元素*/
for(p=i+s/2;p
a[p][q]=a[p-s/2][q-s/2];/*把左上角的数据赋给右下角的元素*/
}
}
void main()
{int i,j,k;
int s=1;
printf("input the numver k :\n");/*输入问题的规模*/
scanf("%d",&k);
for(i=1;i
s=s*2;
for(i=1;i
a[i][1]=i;
form(1,s,s) ;
for(i=1;i
{ for(j=1;j
printf("%d ",a[i][j]);/*循环输出数组*/
printf("\n");
}
}