这个问题可以看作是一个精确覆盖 http://en.wikipedia.org/wiki/Exact_cover_problem问题可以像数独一样解决算法X http://en.wikipedia.org/wiki/Knuth%27s_Algorithm_X,其中有Python 实现 http://www.cs.mcgill.ca/~aassaf9/python/algorithm_x.html可以在网上找到。
需要覆盖的集合包括:
对于四支球队来说是:
A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3, AB, AC, AD, BC, BD, CD
where B3
意味着团队B
当天播放3
and BD
意味着团队B
玩团队D
.
可用的子集是所有比赛配对与所有比赛日的组合,对于四支球队来说是:
AB1: A1, B1, AB
AB2: A2, B2, AB
AB3: A3, B3, AB
AC1: A1, C1, AC
...
CD3: C3, D3, CD
解决这个问题会产生很多可能的赛程,基本上是球队和比赛日的排列。选择一个,按比赛日订购并开始比赛。
如果团队数量为奇数,则无解。添加一支空队作为虚拟球队,并且不要参加其中一方为虚拟球队的比赛。