目录

一.问题介绍

二.算法思想:

1.分治法的基本思想

2.问题规模扩大的算法思想:

3.填充算法思想

三.算法思想C语言描述

1.非递归法:

2.递归调用的方法:



一.问题介绍

设有n=2k(k=1,2,…)个运动员要进行循环赛,现在设计一个满足要求的比赛日程表;

有如下要求:

1每个选手要与其他n-1个选手进行一次比赛;

2每个选手明天只能比赛一次;

3循环赛为期n-1天;

首先我们先来看当k=1时的比赛情况

这时有两名选手;

选手

对战者

1

2

2

1

此时需要进行1场比赛,

当k=2,有四个运动员时

选手

对战者

1

2

3

4

2

1

4

3

3

4

1

2

4

3

2

1

此时观察表格,

表格意义:的是在第i行,第j列,表示第i位选手,第j天遇到的选手;

根据分治法的意义我们可以将n/2个选手分为一组,则如下图所示:

选手

对战者

1

2

3

4

2

1

4

3

3

4

1

2

4

3

2

1

二.算法思想:

1.分治法的基本思想

  1. 该问题的规模缩小到一定的程度就可以容易的解决。
  2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
  3. 利用该问题分解出的子问题的解可以合并为该问题的解。
  4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

2.问题规模扩大的算法思想:

当n=4时,我们填充的二元组为4*4,

I<=2时为初始数组;

(1,1)时为1;(1,2)时为2

(2,1)时为2;(2,2)时为1;

以此类推当i>2时;

(i,1)为i+n/2;(i,2)时为i+n/2+1;

此时二元组为:

选手

对战者

1

2

2

1

3

4

4

3

3.填充算法思想

划分到2个选手时已经为最优子结构,当拓展到4个选手时不难发现,

表格对角相同,满足关系

左上角与右小角:a[i][j]=a[i+n/2][j+n/2]

右小角与左上角:a[i][j]=a[i-n/2][j+n/2]

当k=3时,有8个运动员;如图

选手

对战者

1

2

3

4

5

6

7

8

2

1

4

3

6

5

8

7

3

4

1

2

7

8

5

6

4

3

2

1

8

7

6

5

5

6

7

8

1

2

3

4

6

5

8

7

2

1

4

3

7

8

5

6

3

4

1

2

8

7

6

5

4

3

2

1

此时上述思想也成立。

三.算法思想C语言描述

1.非递归法:

非递归:

void GameTable_1(int n) {size_t s = n;int k = 0;while (s = s >> 1) { k++; }       //通过位运算获得K值;//初始化a[0][0] = 1;a[0][1] = 2;a[1][0] = 2;a[1][1] = 1;for (int i = 2; i <= k; i++) {                             //从K=2,n=4开始填充,直到将整个表填充完;int length = 0x1 << i;   //使length获得当前组的人数值;int half = length >> 1;  //half=length/2;//左下角的子表中项为左上角子表对应项加half=2^(i-1)for (int row = 0; row < half; row++) {          //填充每一个子结构for (int col = 0; col < half; col++) {a[row + half][col] = a[row][col] + half;}}//填充右上角for (int row = 0; row < half; row++) {for (int col = 0; col < half; col++) {a[row][col + half] = a[row + half][col];}}//填充左下角for (int row = 0; row < half; row++) {for (int col = 0; col < half; col++) {a[row + half][col + half] = a[row][col];}}}for (int i = 0; i < n; i++) {             //输出结果for (int j = 0; j < n; j++) {printf("%d  ", a[i][j]);}printf("\n");}}

2.递归调用的方法:

int GameTable_2(int n, int k) {if (n == 2) {                     //子问题为2位参赛队伍b[k][0] = k + 1;b[k][1] = k + 2;b[k + 1][0] = k + 2;b[k + 1][1] = k + 1;}else {                                  //当问题大于2时,通过递归调用直到问题等于2到达递归出口;GameTable_2(n / 2, k);GameTable_2(n / 2, k + n / 2);//填充剩余表格for (int i = k; i < k + n / 2; i++) {for (int j = n / 2; j < n; j++) {b[i][j] = b[i + n / 2][j - n / 2];}}for (int i = k + n / 2; i < k + n; i++) {for (int j = n / 2; j < n; j++) {b[i][j] = b[i - n / 2][j - n / 2];}}}

循环赛赛程表的分治法实现相关推荐

  1. 循环赛 c语言,循环赛日程安排问题(分治法)

    问题描述: 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. 按此要求,可将比赛日程表设计成一 ...

  2. 分治法-循环赛日程表

    问题描述 循环赛日程表:有n = 2^k个运动员要进行网球循环赛 赛程表满足: 每个选手必须与其他n-1个选手各赛一次 每个选手一天只能参赛一次 循环赛在n-1天内结束 解题思路 将比赛日程表设计成一 ...

  3. 【分治法】解决循环赛问题(n分为奇数和偶数)

    原文地址:https://ericpengshuai.github.io/suan-fa/cd0cd01e2295.html 例题 设有N个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表 ( ...

  4. 分治法-循环赛日程表问题

    问题描述: 设有n=2^k个运动员,要进行网球循环赛. 每个选手必须与其他n-1个选手各赛一次. 每个选手一天只能赛一次. 循环赛一共进行n-1天. 算法策略: 1.将所有的选手分为两半,n个选手的比 ...

  5. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

    一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...

  6. 分治法求循环赛日程表

    设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)循环赛一共进行n-1天. 按要求可将 ...

  7. 分治法:循环赛日程安排问题

    问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表: 1)每个选手必须与其它n-1个选手各赛一次: 2)每个选手一天只能赛一次. 分析,按照上面的要求,可以将比赛表设计成一个n行 ...

  8. java 循环赛问题,网球循环赛思路 - 分治法求解(无代码)

    分治法: 列出人数为的情况: K = 1 1 2 2 1 其中第一列是选手的序号,之后n列代表着选手的对手 K = 2 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 可以看出,k=4 ...

  9. python应用——分治法实现循环赛

    一.要求 用分治法实现循环赛: 一共有n个选手要进行循环赛,请设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)当n 是偶数,循 ...

最新文章

  1. 变了味的微信你还能用多久?
  2. undefined reference to `pthread_create‘(linux下Clion使用thread报错)
  3. log4j自定义配置文件(SpringMVC项目)
  4. POJ 3613 Cow Relays (floyd + 矩阵高速幂)
  5. docker 磁盘问题:device or resource busy
  6. Windows 下安装 Redis 1
  7. 如何使用print()打印类的实例?
  8. python求解最大子序列乘积问题,子序列可连续也可不连续
  9. CSND默认markdown样式
  10. html怎么绘制中国地图,利用d3.js绘制中国地图
  11. vant 验证手机号_Vue 正则表达式验证邮箱和手机号码
  12. 同为标准版 OPPO Reno7和华为nova9怎么选,这几点要搞清楚
  13. 全局变量和局部变量笔记
  14. MySQL 与 PostgreSQL 比较,哪个更好、我们该选用哪个?
  15. 量子计算机与易经,易经卦象的演化过程,就是一个量子计算机模型
  16. 体会一下hop-by-hop逐跳头中的路由器告警选项(Router Alert Option)的玩法
  17. sedona-技术框架
  18. 2022牛客多校第一场A、C、D、G、I、J
  19. 自考计算机科学与技术本科毕业论文选题,自考本科毕业论文探究.doc
  20. Linux下的按键驱动

热门文章

  1. 汽车UDS诊断之例程控制服务(0x31)深度剖析
  2. ip免费代理科普知识四:IP 地址类别
  3. 我开通了个人网站,望指教
  4. Squid实现正向代理
  5. (C语言)从键盘输入输入一个不大于5位的整数,判断位数,并逆序输出
  6. 汇总:2017 年 IT 界最严重的裁员事件
  7. 忘记虚拟机主机管理员登录密码
  8. time.js 时间函数库
  9. linux yum卸载与安装软件包,Linux yum命令详解(查询、安装、升级和卸载软件包)...
  10. 第10章 CustomView Android画布