问题描写叙述:
            设有n(n = 2^k)位选手參加网球循环赛,循环赛共进行n-1天,每位选手要与
        其它n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。试按此要求
        为比赛安排日程。

编程思想:
            如果n位选手被顺序编号为1,2,3,...,n,比赛的日程表是一个n行n-1列的表格,
        i行j列的表格内容是第i号选手在第j天的比赛对手。
            依据分而治之的原则,可从当中一半选手(2^(n-1位)的比赛日程,导出全体n位
        选手的日程,终于细分到仅仅有两位选手的比赛日程出发。
            可如果仅仅有8位选手參赛,若1至4号选手之间的比赛日程填在日程表的左上角
        (4行3列),5至8号选手之间的比赛日程填在日程表的左下角(4行3列);那么左下角的
        内容可由左上角的相应项加上数字4得到。至此,剩余的右上角(4行4列)是为编号小的
        1至4号选手与编号大的5至8号选手之间的比赛日程安排。比如,在第4天,让1至4号选
        手分别与5至8号选手比赛,以后各天,依次由前一天的日程安排,让5至8号选手“循环
        轮转”就可以。
        最后,比赛日程表的右下角的比赛日程表可由,右上角的相应项减去数字
        4得到。
    编程图例:
        
    ===================================================================
    |*| 选手    1天        2天        3天        4天        5天        6天        7天    |*|
    ===================================================================
    |*|    1号    |    2    |    3    |    4    ||    5    |    6    |    7    |    8    |*|
    |*|    2号    |    1    |    4    |    3    ||    6    |    7    |    8    |    7    |*|
    |*|    3号    |    4    |    1    |    2    ||    7    |    8    |    5    |    6    |*|
    |*|    4号    |    3    |    2    |    1    ||    8    |    5    |    6    |    5    |*|
    ========[左上角]========================[右上角]===================
    |*|    5号    |    6    |    7    |    8    ||    1    |    4    |    3    |    2    |*|
    |*|    6号    |    5    |    8    |    7    ||    2    |    1    |    4    |    3    |*|
    |*|    7号    |    8    |    5    |    6    ||    3    |    2    |    1    |    4    |*|
    |*|    8号    |    7    |    6    |    5    ||    4    |    3    |    2    |    1    |*|

========[左下角]========================[右下角]===================

#define    MAXN    64
//日程表数组
int    calendar[MAXN + 1][MAXN];
void    Round_Robin_Calendar()
{int i,j,m,number,p,q;printf("输入选手个数:(注意:2^k) ");scanf("%d",&number);//预置两位选手的比赛日程表://第i位选手第j天与第calendar[i][j]位选手比赛calendar[1][1] = 2;        //第1位选手第1天与第2位选手比赛calendar[2][1] = 1;        //第2位选手第1天与第1位选手比赛m = 1;p = 1;while(m < number){m ++;//p = p + p;p += p;q = 2 * p;    //为2^m位选手安排比赛日程//填充日程表的左下角for(i = p + 1;i <= q;i++)for(j = 1;j<= p - 1;j++)calendar[i][j] = calendar[i - p][j] + p;    //左下角的内容 = 左上角的相应项加上数字4[]//填充日程表的右上角//填充日程表的右上角的第1列calendar[1][p] = p + 1;        for(i = 2;i <= p;i++)calendar[i][p] = calendar[i - 1][p] + 1;//填充日程表的右上角的其它列,參照前一列填充当前列[循环轮转算法]for(j = p + 1;j < q;j++){for(i = 1;i < p;i++)calendar[i][j] = calendar[i + 1][j - 1];calendar[p][j] = calendar[1][j - 1];}//填充日程表的右下角for(j = p;j < q;j++)for(i = 1;i <= p;i++)calendar[calendar[i][j]][j] = i;    //关键语句for(i = 1;i <= q;i++){for(j = 1;j < q;j++)printf("%4d",calendar[i][j]);printf(" ");}printf(" ");}
}
//:====================“循环赛日程安排”问题的分而治之解决算法====================int main(int argc, char* argv[])
{Round_Robin_Calendar();printf(" 应用程序执行结束! ");return 0;
}

转载于:https://www.cnblogs.com/blfshiye/p/4369001.html

分治法之循环赛日程表相关推荐

  1. 分治法解决循环赛日程表

    分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...

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

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

  3. 分治法之循环赛日程表的理解和解题思路

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

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

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

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

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

  6. 分治法——循环赛事日程表

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

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

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

  8. chatGPT教你算法(4)——分治法

    0. 引言 在计算机科学中,分治法是一种用于解决复杂问题的常用方法.它的核心思想是将大问题分解为若干个规模较小的子问题,递归地解决这些子问题,最后再将它们的结果组合起来得到原问题的解. 本博客将向大家 ...

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

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

最新文章

  1. axure 下拉多选 元件_Axure教程:下拉多选列表集合(多选下拉列表+单选下拉列表+分级下拉列表)...
  2. python教程很详细_Python编程入门教程:从入门到高级,非常详细
  3. mysql not in 多列,MySQL中的多列外键?
  4. Scrapy+eChart自动爬取生成网络安全词云
  5. opencv——访问图像元素(imagedata widthstep)
  6. 字典写入excel_Excel中“先出式”出货的问题,以后出库太方便了
  7. NOIP2016 游记
  8. 什么是 DNS,有什么作用?为什么需要更换公共DNS服务器?
  9. C++A类继承B C类_长期投资指数基金到底选择A类收费还是C类收费
  10. 微信小程序自定义组件(1)----地址选择器
  11. 【Android】APK应用安装过程源码解析
  12. 学机器学习有必要懂数学吗?深入浅出机器学习与数学的关系
  13. CSS3 动画实现方法大全
  14. 滴滴小程序框架Mpx2.0
  15. 数据结构相关重点(个人总结)
  16. jt2go转不了转为html,使用TS时,markdown 转 html,代码块不能转换
  17. matlab求方程在X附近的根,matlab 实验03 求代数方程的近似根(解)
  18. 【Python】pdf文件逐页转图片/修改图片存储大小脚本
  19. 全球五大违背力学的建筑背后的仿真计算与监测技术
  20. 3、ClickHouse表引擎-MergeTree引擎

热门文章

  1. java二维矩阵怎么进行转置_矩阵求导的本质与分子布局、分母布局的本质(矩阵求导——本质篇)...
  2. 统计各个函数的耗时_Prometheus 常用函数 histogram_quantile 的若干“反直觉”问题...
  3. python列表切片得到的是列表还是字符串_python中列表的切片问题 python arry怎么取列切片...
  4. popen函数_PHP中16个高危函数
  5. QML和C++混合编程--(一)
  6. 简述数据字典的结构及其作用_数据结构——树基本概念及其遍历
  7. html代码在线运行环境,ES5/可执行代码与执行环境
  8. 知识工程学:一个新的重要研究领域
  9. 集合(normal)
  10. oracle 11g r2配置文件,Oracle 11g R2 常用配置与日志的文件位置