问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表:

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

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

按照上面的要求,可以将比赛表设计成一个n行n-1列的二维表,其中第i行第j列的元素表示和第i个选手在第j天比赛的选手号,也就是对手。

采用分治策略,可将所有参加比赛的选手分成两部分,n=2^k个选手的比赛日程表就可以通过n=2^(k-1)个选手的的比赛日程表来决定。递归的执行这样的分割,直到只剩下两个选手,比赛日程表的就可以通过这样的分治策略逐步构建。

从0开始对列编号,0列是自己跟自己打,1列是第一天比赛的对手号码。表的颜色相同部分是一样的。

队伍只有两个时:

队伍四个时:

队伍八个时:

算法如下:

初始化一个数组a[n-1][n-1],输入:队伍数目n。

一、n=0的时候
a[0][0]=1;

二、n>0

1、n>0的时候把问题一分为二,递归地把左上角的矩阵生成好。
2、然后根据左上角矩阵,让右上角矩阵对应元素+n/2。
3、再把左下角元素和右上角元素对应起来,右下角元素和左上角元素对应起来。

代码

#include<iostream>
using namespace std;
#define M 10000
int a[M][M]={0};void merge(int n)
{int m= n/2;for(int i=0;i<m;i++)for(int j=0;j<m;j++){a[i][j+m]=a[i][j]+m;  //由左上角得到右上角a[i+m][j]=a[i][j+m];  //由右上角得到左下角a[i+m][j+m]=a[i][j];  //由左上角得到右下角}
}
void arrangement(int n)
{if(n==1){a[0][0]=1;return;}arrangement(n/2);  merge(n);
}
int main()
{int n;cout<<"请输入需要比赛的队伍数(偶数):"<<endl;cin>>n;cout<<"赛程安如下:"<<endl;arrangement(n);for(int i=0; i<n;i++){for(int j=0;j<n;j++)cout<<a[i][j]<<" ";cout<<endl;}return 0;
}

算法-分治法-循环赛的日程安排相关推荐

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

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

  2. C#内功修炼(算法)——分治法(一)

    分治法(递归的解决问题) 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这 ...

  3. 关于算法--分治法--合并排序

    分治法: 1.思想:①将问题的实例划分为同一个问题的几个较小的实例,最好拥有相同的规模:②对于较小的实例进行求解,一般使用递归法,在问题规模足够小的情况下也是用另一个算法:③如果必要的话,合并这些较小 ...

  4. 算法--分治法归并排序 python

    设计算法 我们可以选择使用的算法设计方法有很多,插入排序使用了增量方法:在排序子数组A[1-j-1]后,将单个元素A[ j ]插入子数组的适当位置,产生排序好的子数组A[1-j]. 而这次我们将考查另 ...

  5. 跟我一起学算法——分治法

    目录 1.定义 2.适用条件分析 3.步骤 应用1:归并排序 步骤 算法 算法分析 应用2:快速排序 基本思想 算法 算法分析 参考 @ 分治法(Divide and Conquer) 1.定义 对于 ...

  6. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

    (1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...

  7. 算法导论-排序算法-分治法

    1.分治法原理 所谓的分治指的就是分而治之,即将大规模的问题分解成几个较小规模的问题.通过对较小规模问题的求解达到对整个问题的的求解.当我们将问题分解成两个较小问题求解时的分治方法就是二分法. 分支的 ...

  8. 循环赛日程表算法——分治法

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

  9. 分治法循环赛c语言,循环赛问题分析和C语言代码-分治法.doc

    WORD格式整理版 学习好帮手 问题描述:设有n个运动员要进行网球循环赛.设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)当n ...

最新文章

  1. 花了我一个晚上浓缩了一整套阿里资深技术专家设计教程整理出的java架构设计方法
  2. 机器性能这么好,为什么点击右键弹出菜单还这么慢?
  3. java post请求 json_好程序员Java教程分享Vue插件之Axios
  4. 园林系统优秀党员推荐材料_园林绿化公司党员先进个人事迹材料
  5. android module 引用libs里面的so文件_Android中的JNI开发,你了解多少?
  6. 采用Turbo编码的图像传输试验(AWAG信道,matlab实现)分别验证了不同交织器类型,交织深度对turbo码性能的影响
  7. C++中智能指针-atuo_ptr、unique_ptr
  8. animation动画不生效_你可能不知道的Animation动画技巧与细节
  9. 又一重磅利好,海南撒10亿基金发展区块链技术
  10. java,mysql,oracle出现科学记数法问题
  11. Spring Data JPA自定义SELECT查询语句,自定义UPDATE修改语句
  12. 软件评测师证书有什么用,前景怎样啊?
  13. 对JRTPLIB的学习
  14. 1044:判断是否为两位数
  15. 2019 CSP-J 真题 题目、答案以及解析
  16. Citrix XenDesktop 简介
  17. 电脑图片删除怎么找回?快试试这个方法!
  18. SUMO利用转弯率构建车流rou文件
  19. yum install 报错Error downloading packages
  20. joomla 安装不上,出现Warning: session_start():Warning: session_write_close()错误

热门文章

  1. 一个做耽美漫画的内容网站源码解析过程,讲解他的框架和功能实现
  2. python web项目导出zip文件_通过javascript在网页端生成zip压缩包并下载
  3. mac超级眼,实时为您的mac系统状态进行高效监控
  4. Log4j 漏洞修复和临时补救方法
  5. 基于TDOA的Chan氏算法代码解释
  6. 一个域名可以同时在多家服务器商备案吗?
  7. Epic安装新Epic Online Services内部模块报错EOS-ERR-1603解决
  8. RS232/485串口转CANbus总线网关模块CAN232/485MB转换器CANCOM的简介
  9. 笑谈ArcToolbox (2) 开启ArcToolbox的钥匙
  10. HDU - 4540 威威猫系列故事——打地鼠