问题描述
设有n=2k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其它n-1个选手各赛一次;
(2)每个选手一天只能比赛一次;
(3)循环赛一共需要进行n-1天。
由于n=2^k,显然n为偶数。
按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。
分治法求解思路
(1)如何分,即如何合理地进行问题的分解?
一分为二
(2)如何治,即如何进行问题的求解?
进行合并
(3)问题的关键——发现循环赛日程表制定过程中存在的规律性。
循环赛日程表算法描述:
Void Round_Robin_Calendar(int k, int **a)
{ int n=1,i,j,s;
n = 1<<k;
for(i=1;i<=n;i++) a[