题目说明:

设有n=2k(k为上标)个选手要进行循环赛,要求设计一个满足以下要求的比赛日程表:

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

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

按此要求,可将比赛日程表设计成一个 n 行n-1列的二维表,其中,第 i 行第 j 列表示和第 i 个选手在第 j 天比赛的选手。

此题采用分治策略,通过在k=1和k=2时找到打印规律:

k=1:        1 2           k=2:  1 2 3 4

2 1                      2 1 4 3

3 4 1 2

4 3 2 1

第一列为所有选手,每一行的除了第一列外,剩下的每一列都是该选手在接下来的n-1天要面对的比赛对手。通过观察,可以发现,左上角和右下角的数字相同,左下角和右上角的数字相同(对于k=2,以k=1的规模为整体观察)。

程序设计思路(c++实现):因为C++不能按指定行打印,所以先创建一个足够大的二维数组将结果先存入其中,如a[N][N]。在n=2*k个选手比赛时,先确定左上角的数据和左下角的数据,在利用对称复制,将左下角的数据复制到右上角,将左上角的数据复制到右下角。详细说明请查看代码注释。

#include <iostream>
using namespace std;
const int N = 50;
int a[N][N];  //定义足够大的数组void dim(int i, int j, int n) {int k1, k2;int mid = n / 2;if (n == 2) {    //当递归到只有两个选手时,i=1,j=2,n=2a[i][n] = j;   //右上角为2a[j][n] = i;   //右下角为1a[i][n - 1] = i; //左上角为1a[j][n - 1] = j; //左下角为2} else {dim(i, i + mid - 1, mid); //递归一半mid,开始为i,结束为i到mid的个数,即i+mid-1,规模为middim(i + mid, j, mid); //递归另一半mid,开始为i+mid,j,规模为mid//此for循环中,需要复制规模为mid行mid列,一趟循环先复制第n列,再一趟循环复制第n-1列,直到第mid+1列//对于复制的下标的确定,可以想象n=2*2个选手时的下标跟着下面的循环走一遍for (k1 = n; k1 > mid; k1--) {//以下for循环的边界的确定k2 <= i + mid - 1和k2 <= i + n - 1,//可以用k2的初始值+mid的大小确定。循环次数为midfor (k2 = i; k2 <= i + mid - 1; k2++) { //此for循环将左下角的数据复制到右上角a[k2][k1] = a[k2 + mid][k1 - mid];}for (k2 = i + mid; k2 <= i + n - 1; k2++) { //此for循环将左上角的数据复制到右下角a[k2][k1] = a[k2 - mid][k1 - mid];}}}
}int main() {int n = 1, i, j, k;scanf("%d", &k);    //输入k,但是选手是n=2k(k为上标),即2的k次方个选手for (i = 1; i <= k; i++)   //所以n是2的k次方,打印的日程表是n×n的表格。n = n * 2;dim(1, n, n);        //第一个参数是第一行,第二个参数是第n行,第三个参数为要处理n行。for (i = 1; i <= n; i++) {      //递归完成,双重for循环打印二维数组cout << endl;for (j = 1; j <= n; j++) {cout << a[i][j] << " ";}}return 0;
}

循环赛日程表(递归实现)相关推荐

  1. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  2. 3.2.4循环赛日程表(递归与分治)

    目录 1.问题描述 2.算法分析 算法 3.摘要 参考书籍 1.问题描述 设有个运动员要进行网球循环赛. 现要设计一个满足以下要求的比赛日程表. (1)每个选手必须与其他个选手各比赛一次: (2)每个 ...

  3. 循环赛日程表 (递归与分治)

    文章目录 1.题目 2.问题分析 3.什么是分治 4.算法实现思路 1.对表进行分析 2.对表的实现 1.递归 2.循环 5算法实现代码 1.递归 2.循环 6.时间\空间复杂度 1.递归 1.空间复 ...

  4. 循环赛日程表(非递归)

    #include<iostream> #include<vector> #include<iterator> #include<algorithm> u ...

  5. 循环赛日程表(递归法)

    #include<iostream> #include<vector> #include<iterator> #include<algorithm> u ...

  6. 递归与分治策略算法之循环赛日程表

    递归与分治策略算法之循环赛日程表 1.先简单的来介绍一下分治策略的思想 分治策略的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,分解出来的子问题与原问题相同,并且相互独立.通过递归去解决子 ...

  7. python【数据结构与算法】循环赛日程表(分治)

    文章目录 1 概述 2 解决 1 概述 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 循环赛一共需要进行n-1天. 由于n=2^k个运动员,显 ...

  8. 2.11 循环赛日程表

    博主简介:一个爱打游戏的计算机专业学生 博主主页: @夏驰和徐策 所属专栏:算法设计与分析 目录 书本内容: 我的理解: 更优化的算法: 总结 1.注意实现问题 2.当用C语言和C++实现循环赛日程表 ...

  9. 任意人数的循环赛日程表 分治 非分治 c++

    循环赛日程表 要求 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环赛进行n天: 举例 4位 ...

最新文章

  1. ES5-Array-push(),pop(),shift(),unshift()
  2. java 异常处理
  3. Linux 下解压文件命令大全
  4. Java面试题 简述jvm内存模型?
  5. python中用socket检测端口_python基于socket函数实现端口扫描
  6. Effective Java -- 思维导图
  7. c 服务器文件路径,c打开服务器文件路径
  8. bzoj 1667: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛(BFS)
  9. 弘辽科技:开庭了辛巴被诉“永久封号”
  10. android手机投影到电视软件下载,安卓手机怎么投屏到电视?这两种方法最简单!...
  11. 预防胜于补救 《热血江湖》防盗号傻瓜手册(转)
  12. python一阶差分_Python使用pandas对数据进行差分运算的方法
  13. 挖矿病毒audiodg.exe\taskhost.exe溯源与手动查杀方法
  14. 机器学习实战(七):Ensemble Learning and Random Forests
  15. RSF 分布式服务框架设计
  16. python提取电子发票_Python办公自动化—电子发票台账制作自动化(3)
  17. EMA(指数移动平均)及其深度学习应用
  18. 2022年怎样的企业才能迎难而上?这场年会给你答案
  19. YouTube联合创始人陈士骏新公司AVOS完成A轮融资
  20. 软件开发未来发展五大趋势,从业者们注意了!

热门文章

  1. idea本地起项目,手动自由切换dev、test环境问题
  2. 2022第十一届PMO大会日程已定,将于8月13-14日和20-21日线上召开
  3. CAS,ReentrantLock和synchronized总结
  4. 通过蓝点无限的学习,对UWB实现的过程以及对UWB连接WIFI的遇到的问题进行复盘
  5. 常见的纸张及相片尺寸
  6. hfs explorer java_HFSExplorer0.23.1下载_HFS格式磁盘文件查看工具 含使用教程
  7. 设计思维——科学提升创造力的方法
  8. [模块加载失败:找不到指定的模块]——如何解决DLL加载问题?
  9. APT之木马静态免杀
  10. 【Node.js】初识Node.js