问题描述:
设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次。
按此要求,可将比赛日程表设计成一个 n 行n-1列的二维表,其中,第 i 行第 j 列表示第 i 个选手在第 j 天比赛的选手。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int k=0;
int sum=1;
printf("请输入k值:\n");
scanf("%d",&k);
for(int i=0;i<k;i++){
sum=sum*2;
}
int a[sum+1][sum+1];
a[1][1]=1;
for(int j=0;j<k;j++){//控制版块扩张几次
for(int x=1;x<pow(2,j)+1;x++){//控制x
for(int y=1;y<pow(2,j)+1;y++){//控制Y
int s=(int)pow(2,j);
int f=a[x][y];
a[x+s][y+s]=f;
a[x][y+s]=f+s;
a[x+s][y]=f+s;
}
}
}
for(int i=1;i<sum+1;i++){
for(int j=1;j<sum+1;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
图片: