循环赛日程表算法:
#include <stdio.h>
#define MAX 100
int a[MAX][MAX];
void Copy(int tox,int toy,int fromx,intfromy,int r)
{
for(inti=0;i<r;i++)
for(intj=0;j<r;j++)
a[tox+i][toy+j]=a[fromx+i][fromy+j];
}
//构造循环赛日程表,选手的数量n=2^k
void Table(int k)
{
inti,r;
intn=1<<k;
//构造正方形表格的第一行数据
for(i=0;i<n;i++)
a[0][i]=i+1;
//采用分治算法,构造整个循环赛程
for(r=1;r<n;r<<=1)
for(i=0;i<n;i+=2*r)
{
Copy(r,r+i,0,i,r);
Copy(r,i,0,r+i,r);
}
printf("参赛人数为:%d\n(第i行第j列表示和第i个选手在第j天比赛的选手序号)\n",n);
for(i=0;i<=n-1;i++)
for(r=0;r<=n-1;r++)
{
printf("%d ",a[i][r]);
if(r==n-1)
printf("\n");
}
}
intmain() {
int i,r,k;
int n=2^k;
printf("比赛选手个数为n(n=2^k),请输入参数K(K>0):\n");
scanf("%d",&k);
if(k!=0)
Table(k);
return 0;
}
运行效果: