循环赛赛程表的分治法实现
目录
一.问题介绍
二.算法思想:
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.分治法的基本思想
- 该问题的规模缩小到一定的程度就可以容易的解决。
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
- 利用该问题分解出的子问题的解可以合并为该问题的解。
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
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];}}}
循环赛赛程表的分治法实现相关推荐
- 循环赛 c语言,循环赛日程安排问题(分治法)
问题描述: 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. 按此要求,可将比赛日程表设计成一 ...
- 分治法-循环赛日程表
问题描述 循环赛日程表:有n = 2^k个运动员要进行网球循环赛 赛程表满足: 每个选手必须与其他n-1个选手各赛一次 每个选手一天只能参赛一次 循环赛在n-1天内结束 解题思路 将比赛日程表设计成一 ...
- 【分治法】解决循环赛问题(n分为奇数和偶数)
原文地址:https://ericpengshuai.github.io/suan-fa/cd0cd01e2295.html 例题 设有N个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表 ( ...
- 分治法-循环赛日程表问题
问题描述: 设有n=2^k个运动员,要进行网球循环赛. 每个选手必须与其他n-1个选手各赛一次. 每个选手一天只能赛一次. 循环赛一共进行n-1天. 算法策略: 1.将所有的选手分为两半,n个选手的比 ...
- 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...
一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...
- 分治法求循环赛日程表
设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)循环赛一共进行n-1天. 按要求可将 ...
- 分治法:循环赛日程安排问题
问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表: 1)每个选手必须与其它n-1个选手各赛一次: 2)每个选手一天只能赛一次. 分析,按照上面的要求,可以将比赛表设计成一个n行 ...
- 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 ...
- python应用——分治法实现循环赛
一.要求 用分治法实现循环赛: 一共有n个选手要进行循环赛,请设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)当n 是偶数,循 ...
最新文章
- 变了味的微信你还能用多久?
- undefined reference to `pthread_create‘(linux下Clion使用thread报错)
- log4j自定义配置文件(SpringMVC项目)
- POJ 3613 Cow Relays (floyd + 矩阵高速幂)
- docker 磁盘问题:device or resource busy
- Windows 下安装 Redis 1
- 如何使用print()打印类的实例?
- python求解最大子序列乘积问题,子序列可连续也可不连续
- CSND默认markdown样式
- html怎么绘制中国地图,利用d3.js绘制中国地图
- vant 验证手机号_Vue 正则表达式验证邮箱和手机号码
- 同为标准版 OPPO Reno7和华为nova9怎么选,这几点要搞清楚
- 全局变量和局部变量笔记
- MySQL 与 PostgreSQL 比较,哪个更好、我们该选用哪个?
- 量子计算机与易经,易经卦象的演化过程,就是一个量子计算机模型
- 体会一下hop-by-hop逐跳头中的路由器告警选项(Router Alert Option)的玩法
- sedona-技术框架
- 2022牛客多校第一场A、C、D、G、I、J
- 自考计算机科学与技术本科毕业论文选题,自考本科毕业论文探究.doc
- Linux下的按键驱动