题目
为参加网球比赛的选手安排比赛日程
设有n(=2k)位选手参加网络循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手都赛一场,且每位选手每天赛一场,不论空。按此要求编程为比赛安排比赛日程
其他方法:暴力法
思路
用矩阵M[][]表示比赛,M[i][j]表示第i个选手在第j天的比赛对手是j
【只考虑一天】
- 有4个选手(1,2,3,4),第一天安排1和2比赛后,3只能和4比赛
- 所以,可以采用分治法,将所有参加比赛的选手n分成两部分,只要确定n/2部分,另外的一部分即可以确定
- 一直往下分,直到只剩下两个选手,那今天的比赛就安排完了
【分治法】
举例:只有2个选手的日程安排
| 选手 | 第0天 | 第1天 |
|---|---|---|
| 1 (1号选手) |
1 (第0天,1号选手和自己打) |
2 (第1天,1号选手和2号打比赛) |
| 2 (2号选手) |
2 (第0天,2号选手和自己打) |
1 (第1天,2号选手和1号打比赛) |
【注意】上面的表格除去第一行、第二行即为矩阵M[][]的内容,接下来的矩阵都不给出第一行和第一列,直接给出矩阵值
【问题】为什么要有第0天呢?第0天的值也是矩阵的内容,需要填充,更好做分治
举例:4个选手(只写出矩阵内容)
举例:8个选手
步骤
举例:8个选手
- 求左上角的子表A:左上角子表是前2^(k-1)个选手的比赛前半程的比赛日程
1,2,3,4选手前3天的比赛安排:左下角子表是剩余的2^(k-1)
个选手的比赛前半程比赛日程。这个子表和左上角子表的对应关系式,对应元素等于左上角子表对应元素加2^(k-1) - 求左下角的子表B
5,6,7,8选手前3天的比赛安排,实际就是A的值加一个4 - 求右上角的子表C:等于B
- 求右下角的子表D:等于A
代码