最近在学习算法分析与设计这门课时,遇到了循环赛日程表问题。我感觉课本上的方法并不是很好(浪费空间而又不好理解),而网上流传的代码也基本和课本上类似,于是我决定用自己的方式来实现这个算法。
目录
问题描述
设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表:
每个选手必须与其他n-1个选手各赛一次;
每个选手一天只能赛一次;
循环赛一共需要进行n-1天
由于n=2^k,显然n为偶数。
算法思路
根据分治法的思想,递归地将问题一分为二,直到只剩下两个人比赛,最后在将这些问题合并起来,这样问题就变得十分简单。日程表的制定过程中存在一定的规律,即第i行第j列表示第i个选手在第j天所遇到的选手。这样算法就很容易实现了。
2^1个选手的比赛日程表
当问题规模为2^1时,此时问题最为简单,只需要将每个选手复制到对角线位置即可。
2^2个选手的比赛日程表
当问题规模为2^2时,将问题划分为2个规模为2^1