题目要求

设有 n = 2 k n=2^{k} n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表:

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

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

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

解题思路

这个没什么好办法,我是话了n=2,n=4,n=8的情况找规律做的
假设不按题目要求来,比了n天比赛,第一天都是选手自己和自己比,方便找规律
如果只有一个选手,那就是自己和自己比
如果有两个选手,是这样的

1 2
2 1

正对角线元素相同,逆对角线元素相同
有4个选手是这样的

1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1

可以看到,左上角分块矩阵和右下角是一致的,那就可以用分治的思想来处理了,先处理左上角,再处理右上角,左下角复制右上角,右下角复制左上角。

C语言实现

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
//分治递归,mStart是分治区域的起始的纵坐标,mEnd是分治区域结束的纵坐标
//nStart是分治区域的起始的横坐标,nEnd是分治区域的结束的横坐标
void arrange(int** a, int mStart, int mEnd, int nStart, int nEnd)
{//只有一个参赛选手,只能自己与自己比if (mStart == mEnd && nStart == nEnd){a[mStart][nStart] = nStart;return;}//有两个选手,矩阵对角线相等if (mStart + 1 == mEnd && nStart + 1 == nEnd){//主对角线相等a[mStart][nStart] = nStart;a[mEnd][nEnd] = nStart;//逆对角线相等a[mStart][nEnd] = nEnd;a[mEnd][nStart] = nEnd;return;}int mMid = (mStart + mEnd) / 2;int nMid = (nStart + nEnd) / 2;arrange(a, mStart, mMid, nStart, nMid);//左上角分块矩阵arrange(a, mStart, mMid, nMid + 1, nEnd);//右上角分块矩阵//将左上角分块矩阵复制到右下角for (int i = mMid + 1; i <= mEnd; i++){for (int j = nMid + 1; j <= nEnd; j++){a[i][j] = a[i - mMid][j - nMid];}}//将右上角分块矩阵复制到左下角for (int i = mMid+1; i <= mEnd; i++){for (int j = nStart; j <= nMid; j++){a[i][j] = a[i - (mMid-mStart+1)][j + (nMid - nStart+1)];//mMid-mStart+1是左下角纵坐标到上半矩阵对应纵坐标的距离,nMid - nStart+1同理}}
}
//打印矩阵
void printMatrix(int** a, int m, int n)
{printf("参赛\n选手\t");for (int i = 2; i < n; i++){printf("第%d天\t", i - 1);}printf("\n");for (int i = 1; i < m; i++){for (int j = 1; j < n; j++){printf("%d\t", a[i][j]);}printf("\n");}
}
int main()
{int m = 0;//参赛选手人数printf("请输入参赛选手的个数:\n");scanf("%d", &m);if ((m & (m-1)) != 0)//判断2的n次方的经典条件(m & (m-1))的结果为0就是,注意加括号,符号优先级要注意{printf("参赛选手必须为2的n次方!\n");return 0;}int** matrix = (int**)malloc((m+1) * sizeof(int*));for (int i = 0; i < (m+1); i++){matrix[i] = (int*)malloc((m + 1) * sizeof(int));memset(matrix[i], 0, (m + 1) * sizeof(int));//将二维数组每一行置为0}arrange(matrix, 1, m, 1, m);printMatrix(matrix, m+1, m+1);
}

测试结果

【C语言】【分治算法】循环赛日程安排问题相关推荐

  1. java 循环赛问题_算法——循环赛日程安排问题

    一.问题背景 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: ①每个选手必须与其他n-1个选手各赛一次: ②每个选手一天只能赛一次. 二.问题分析 按此要求,可将比赛日程表 ...

  2. 循环赛日程安排(C语言)

    问题: (先声明一点,下面我写了两种代码,但是都只能满足 队伍数 = 2的幂次方 的情况) 一年一度的欧洲冠军杯马上就要打响,在初赛阶段采用循环制,设共有n队参加,初赛共进行(n-1)天,每队要和其他 ...

  3. 循环赛日程安排问题(分治法)

    问题描写叙述: 设有n(n=2^k)支队伍參加循环赛,循环赛共进行n-1天,每支队伍要与其它n-1支队伍比赛一场, 且每支队伍每天必须比赛一场,不能轮空.试按此要求为比赛安排日程. 算法思路: 我们先 ...

  4. 循环赛日程安排(构造、分治)

    问题描述 N支队伍进行比赛,要求: 任意两支队伍交且仅交过一次手 每天每支队伍至多打一场比赛 比赛尽快完成 问题等价于构造一个N×M矩阵,表示N支队伍比赛M天,第一列固定为1到N,表示每支队伍的编号, ...

  5. 循环赛 c语言,循环赛日程安排问题(分治法)

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

  6. 算法笔记 分治:循环赛日程 棋盘覆盖 选择问题 输油管问题 整数因子分解

    一.循环赛日程 #include <iostream> #include <vector> #include <string> #include <algor ...

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

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

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

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

  9. c语言分治算法之归并排序,分治算法之归并排序

    分治算法: 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同.求出子问题的解后进行合并,就可得到原问题的解. 一般步骤: 1.分解,将要解决的问题划分成若干规模较小 ...

最新文章

  1. 活动推荐 | 2019日立「视频分析技术黑客马拉松」报名启动,还有高额奖金等你赢...
  2. Unity3D客户端和Java服务端使用Protobuf
  3. .NET反编译工具Reflector及插件Reflector.FileDisassembler.dll
  4. easymock+junit+spring学习·
  5. socket通信需要网线连接吗_socket方式实现网络通信
  6. 拉普拉斯矩阵(Laplacian Matrix) 及半正定性证明
  7. python语音识别终极指南_Python语音识别终极指南
  8. 海康sip服务器地址协议,海康摄像头的GB28181的sip服务器+ZL流媒体+前台测试页面...
  9. c++基础 STL 第 0 篇:(模板)
  10. word中没文字地方添加下划线方法
  11. Excel如何查找重复内容
  12. 硬盘安装Win7全攻略(图解)
  13. 关于虚拟机中IPI中断的思考
  14. java计算机毕业设计楼宇管理系统源码+数据库+lw文档+系统
  15. 怎么申请企业邮箱?手机怎么申请免费邮箱?
  16. Switch NS 通过华硕梅林路由DNSMASQ屏蔽任天堂服务器
  17. 【读书笔记】信贷周期的产生
  18. 【100个 Unity实用技能】| 关于触发器互相检测的必要前提条件配置
  19. 浅谈来自德国的电子分类系统eCl@ss
  20. ByteV打造3D海上风电监控平台 ——助力风电能源可持续发展

热门文章

  1. 3个阶段 项目征名_《向往的生活3》增加新成员,开启征名模式,竟是给它们取名字!...
  2. 信息时代与新经济现象
  3. 在ARM M4上运行神经网络,AI芯片公司Kneron获新一轮融资,阿里巴巴创业者基金领投
  4. 论文翻译:2020_DARCN_A Recursive Network with Dynamic Attention for Monaural Speech Enhancement
  5. android下控制鼠标的显示和隐藏
  6. 员工满意度调查表模型如何设计?
  7. kafka-sasl消费示范例子
  8. Navicat工具使用时闪退
  9. php 微信小程序 循环 多选,微信小程序 for 循环详解
  10. oracle oaf环配置境,配置Oracle ebs的oaf开发环境的操作步骤