题目

为参加网球比赛的选手安排比赛日程
设有n(=2k)位选手参加网络循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手都赛一场,且每位选手每天赛一场,不论空。按此要求编程为比赛安排比赛日程

其他方法:暴力法

思路

用矩阵M[][]表示比赛,M[i][j]表示第i个选手在第j天的比赛对手是j

【只考虑一天】

  1. 有4个选手(1,2,3,4),第一天安排1和2比赛后,3只能和4比赛
  2. 所以,可以采用分治法,将所有参加比赛的选手n分成两部分,只要确定n/2部分,另外的一部分即可以确定
  3. 一直往下分,直到只剩下两个选手,那今天的比赛就安排完了

【分治法】
举例:只有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个选手

  1. 求左上角的子表A:左上角子表是前2^(k-1)个选手的比赛前半程的比赛日程
    1,2,3,4选手前3天的比赛安排:左下角子表是剩余的2^(k-1)
    个选手的比赛前半程比赛日程。这个子表和左上角子表的对应关系式,对应元素等于左上角子表对应元素加2^(k-1)
  2. 求左下角的子表B
    5,6,7,8选手前3天的比赛安排,实际就是A的值加一个4
  3. 求右上角的子表C:等于B
  4. 求右下角的子表D:等于A

[矩阵] 安排比赛日程 - 分治法

代码

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-23
  • 2021-08-13
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-17
  • 2021-10-21
  • 2021-04-22
  • 2021-11-23
  • 2021-12-21
  • 2022-01-15
  • 2021-06-17
相关资源
相似解决方案