【问题描述】设有n=2^k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次。 (2)每个选手一天只能赛一次。 (3)循环赛在n-1天之内结束。 【问题求解】按问题要求可将比赛日程表设计成一个n行n-1列的二维表,其中第i行、第j列表示和第i个选手在第j天比赛的选手。 假设n位选手被顺序编号为1、2、…、n(2^k)。
由k=1创建k=2的过程 由k=2创建k=3的过程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5d32a7864b35411a9b16e9e92c4c90bf.png)
将n=2k问题划分为4部分:
(1)左上角:左上角为2k-1个选手在前半程的比赛日程(k=1时直接给出,否则,上一轮求出的就是2k-1个选手的比赛日程)。
(2)左下角:左下角为另2k-1个选手在前半程的比赛日程,由左上角加2k-1得到,例如22个选手比赛,左下角由左上角直接加2(2k-1)得到,23个选手比赛,左下角由左上角直接加4(2k-1)得到。
(3)右上角:将左下角直接复制到右上角得到另2k-1个选手在后半程的比赛日程。
(4)右下角:将左上角直接复制到右下角得到2k-1个选手在后半程的比赛日程。
#include
#define MAX 101
//问题表示
int k; //求解结果表示
int a[MAX][MAX]; //存放比赛日程表(行列下标为0的元素不用)
void Plan(int k)
{ int i,j,n,t,temp;
n=2; //n从2^1=2开始
a[1][1]=1; a[1][2]=2; //求解2个选手比赛日程,得到左上角元素
a[2][1]=2; a[2][2]=1;
for (t=1;t |