设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)循环赛一共进行n-1天。
answer
#include<iostream>
using namespace std;
void gametable(int k)
{
int a[100][100];//赛程表
int n;//当前选手数
int temp;//已安排的选手数
int i;//行
int j;//列
int t;//循环量
n=2;//k=0两个参赛选手日程可以直接求得
a[1][1]=1;a[1][2]=2;
a[2][1]=2;a[2][2]=1;
for(t=2;t<=k;t++)//2^t个选手 安排日程表
{
temp=n;//多了temp个选手 已建立了temp个选手的表
n=n*2;//现在选手数
for(i=temp+1;i<=n;i++)//左下 temp+1新增的第一行
{
for(j=1;j<=temp;j++)//j=1第一列
a[i][j]=a[i-temp][j]+temp;//为同一列的第i-temp行(从上到下依次对应)的值加上新增数temp
}
for(i=1;i<=temp;i++)//右上部分第一行
{
for(j=temp+1;j<=n;j++)//新增部分第一列
a[i][j]=a[j][i];//左下元素对应
}
for(i=temp+1;i<=n;i++)//右下
{
for(j=temp+1;j<=n;j++)
a[i][j]=a[i-temp][j-temp];//与左上相对应
}
}
printf("参赛人数为:%d\n(第i行第j列表示和第i个选手在第j天比赛的选手序号)\n",n);
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;
printf("比赛选手个数为n(n=2^k),请输入参数K(K>0):\n");
scanf("%2d",&k);
if(k!=0)
gametable(k);
}