【问题描述】设有n=24个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:

(1)每个选手必须与其他n-1个选手各赛一次;

(2)每个选手一天只能参赛一次;

(3)循环赛在n-1天内结束。

请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。编写程序,输出k=4时的比赛日常表(矩阵)。

[实验提示]

我们可以按分治策略将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。

1

2

3

4

5

6

7

1

2

3

4

5

6

7

8

2

1

4

3

6

5

8

7

3

4

1

2

7

8

5

6

1

2

3

4

3

2

1

8

7

6

5

1

2

3

4

5

6

7

8

1

2

3

4

1

2

1

4

3

6

5

8

7

2

1

4

3

1

2

3

4

1

2

7

8

5

6

3

4

1

2

2

1

4

3

2

1

8

7

6

5

4

3

2

1

(1)                                               (2)                                                             (3)

图1  2个、4个和8个选手的比赛日程表

[实验步骤]

采用递归方式设计并实现算法并准备测试用例,修改并调试程序,直至正确为止;

应用设计的算法和程序求锦标赛问题;

去掉测试程序,将你的程序整理成功能模块存盘备用.

算法分析:

根据相应的分析,我们需要为最开始的n=2的情况进行人工的赋值。之后我们要做的就是扩大这个矩阵的维度,此时n变成4,那么接下来我们就需要依据这个左上角的矩阵的数据,去依次完善左下角,右上角和右下角的矩阵的内容。经过分析发现相应的矩阵中的数值是有规律的,所以可以依次循环赋值即可。

此时我们根据k的值进行下一次大的循环,此时继续为n进行乘以2处理,然后重复如上的内容即可将该矩阵赋值完成。

代码实现部分:

#include<iostream>
using namespace std;
#define MAX 101
int k;
int a[MAX][MAX];
void plan(int k){int i,j,n,t,temp;n=2;   //k=1的时候 即2的一次方的结果a[1][1]=1;a[1][2]=2;a[2][1]=2;a[2][2]=1;for(t=1;t<k;t++){temp=n;n=n*2;for(i=temp+1;i<=n;i++)for(j=1;j<=temp;j++)a[i][j]=a[i-temp][j]+temp;for(i=1;i<=temp;i++)for(j=temp+1;j<=n;j++)a[i][j]=a[i+temp][(j+temp)%n];for(i=temp+1;i<=n;i++)for(j=temp+1;j<=n;j++)a[i][j]=a[i-temp][j-temp];}
}
int main(){cout<<"please input the k:";cin>>k;plan(k);int i,j,res=1;for(i=1;i<=k;i++)res*=2;for(i=1;i<=res;i++)for(j=1;j<=res;j++){cout<<a[i][j]<<" ";if(j==res)cout<<endl;}return 0;
}

实验结果:

算法分析:锦标赛问题 分治算法相关推荐

  1. 数据结构与算法--分治算法-最大子序列和问题

    分治算法 用于设计算法的一种常用技巧–分治算法(divide and conquer).分治算法由两部分组成: 分(divide):递归然后借机较小的问题(基础情况除外) 治(conquer):然后从 ...

  2. 分治算法详解(超详细)

    原 分治算法详解 分类专栏: 算法详解 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接: https://blog.csdn.net/effective_coder/a ...

  3. 分治算法经典问题---大整数乘法(1~32位大整数乘法)C++

    大整数乘法 大整数乘法(1~32位大整数乘法) 分治的思想 实验题目及要求(大整数乘法) 算法分析(result=m4*10^2^+(m2+m3)*10^n/2^+m1) 算法分析 代码 源文件 ma ...

  4. 递归分析和分治算法 【待研究】

    转载自<a target=_blank href="http://www.cnblogs.com/weixliu/archive/2012/12/21/2827685.html&quo ...

  5. 漫画:5分钟弄懂分治算法!它和递归算法的关系!

    分治顾名思义"分而治之",英文的意思翻译为"分割并征服". 分治思想,简而言之就是将原问题分解成与"原问题相同但是规模更小"的子问题,并可以 ...

  6. 三十三、分治算法---汉诺塔问题

    一.分治算法的介绍 分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以 ...

  7. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

  8. 从分治算法到 MapReduce

    为什么80%的码农都做不了架构师?>>>    从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分 ...

  9. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

最新文章

  1. python和c++的相互调用教程
  2. mysql的delete的底层实现_MySQL索引的底层实现
  3. 一起学DHCP系列(五)指派、获取
  4. 【文字检测算法整理】
  5. 怎样将WPS转换word格式?如何进行操作
  6. python简介及环境安装
  7. Spring3 RESTful Web服务
  8. vue-element-admin中 vuex 的使用
  9. 对象在内存中的存储布局
  10. hdu3526(最小费用流)
  11. 复杂推理模型从服务器移植到Web浏览器的理论和实战
  12. 基于docker使用jenkins集成sonar
  13. Golang实践录:调用C++函数
  14. vi-vim :删除、撤销、恢复删除、复制删除
  15. 我们推荐的高效工具(转)
  16. 桌面计算机怎么覆盖文件,恢复被覆盖的文件_恢复被覆盖的桌面文件
  17. jqgrid 获取所有行数据
  18. ue4文档接口类学习
  19. Google完整安装包下载
  20. 电商后台管理系统——商品管理

热门文章

  1. 智能家居时代下的分手
  2. 盘丝洞服务器维护,关于服务器转档的补充说明
  3. ActiveX 详细介绍
  4. pyqt5画直线(UI界面)----计算机图形学
  5. OS 内存泄漏 导致 整个aix主机block
  6. 关于Android组件化深度分析(七)携程+支付宝
  7. 小白总结Transformer模型要点
  8. CAD中组(Group)如何应用,编组和图块有何区别?
  9. 使用javap指令解析Class文件
  10. GCC 中的编译器堆栈保护技术