该算法的核心问题是合并问题,因为把一个数分成2半,可能得到2种情况:①等分;②一组比另一组多一人;在这里我们巧妙的设计了一下,当一组比另一组多一人时,我们假设了一个虚拟选手,让他参与匹配,最后再把出现虚拟对手的位置置为0,表示这个位置对应的选手当天没有比赛:

/*

* 循环赛日程表.cpp

* Author: Au酱

* Date:2013-04-12

*/

#include

#include

#include

#include

using namespace std;

const int MAX_NUM = 100;

int A[MAX_NUM+2][MAX_NUM+2];

/* 合并子问题 */

void merge(int n)

{

/*

* n 为偶数时,比赛 n - 1 天

* n 为奇数时,比赛 n 天

*/

int days = n % 2 == 0 ? n - 1 : n;

/*

* 中间值,若n为奇数,则使 m = (n / 2) + 1,

* 即,前半部分不小于后半部分

*/

int m = (int)ceil(n / 2.0);

int passd_days = m % 2 == 0 ? m - 1 : m; /* 已经安排的天数 */

/*

* 通过前 n/2 的比赛安排,构造后n/2的比赛安排

* 如果 n 为奇数,则会产生一个虚拟选手

*/

for (int i = 1; i <= m; i++)

{

for (int j = 1; j <= passd_days; j++)

{

if (A[i][j] != 0)/* 如果 i 号在第 j 天有对手 */

{

/*

* 那么,(i + m) 号在第 j 天的对手为 i号的

* 对手往后数 m 号

*/

A[i + m][j] = A[i][j] + m;

}

else /* 如果 i 号在第 j 天没有对手*/

{

/*

* 那么就让 i 号和 (i + m)号互为对手

*/

A[i + m][j] = i;

A[i][j] = i + m;

}

}

}

int add_one = 0;/* 稍后说明 */

if (A[1][passd_days] == m + 1)

add_one = 1;

for (int i = 1; i <= m; i++)

{

for (int j = passd_days + 1, count = 0; j <= days; j++, count++)

{

/*

* i 号在第 j 天的对手,通过枚举后半部分的值

* 来进行匹配

*/

int r_value = (count + (i - 1) + add_one) % m + m + 1;

A[i][j] = r_value;

A[r_value][j] = i;

}

}

if ( n % 2 == 1)/* 如果 n 为奇数,消除虚拟的选手 */

{

for (int i = 1; i <= 2 * m; i++)

{

for (int j = 1; j <= days; j++)

if (A[i][j] == n + 1)

A[i][j] = 0;/* A[i][j] = 0 ,表示 i 号选手在第 j 天没有比赛 */

}

}

}

/* 分治求解循环赛问题 */

void tournament(int n)

{

if (n <= 1)

return;

else if (n == 2)/* 2 个选手 */

{

A[1][1] = 2;

A[2][1] = 1;

}

else

{

tournament((int)ceil(n / 2.0));

merge(n);

}

}

/* 打印循环赛日程表 */

void show_result(int n)

{

cout << " " << n << "人循环赛" << endl;

int days;

if (n % 2 == 0)

days = n - 1;

else

days = n;

cout.flags(ios::left);

cout << setw(8) << "";

for (int i = 1; i <= n; i++)

cout << i << setw(4) << "号";

cout << endl;

cout.flags(ios::left);

for (int j = 1; j <= days; j++)

{

cout << "第 " << setw(2) << j << setw(3) << "天";

for (int i = 1; i <= n; i++)

{

cout << setw(5) << A[i][j];

}

cout << endl;

}

cout << endl;

}

int main()

{

cout << "请输入参赛人数(小于100):";

int num;

cin >> num;

tournament(num);

show_result(num);

cout << "Hit any key to close this window.";

_getch();

}

循环赛日程表算法分析c语言,循环赛日程表相关推荐

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

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

  2. 数据结构与算法分析 C++语言描述第四版.Mark Allen Weiss

    数据结构与算法分析 C++语言描述第四版.Mark Allen Weiss 可用于自学数据结构与算法,数据结构与算法分析对于C++的学习至关重要,应该努力掌握好! 百度网盘: 链接:https://p ...

  3. 《数据结构与算法分析-C语言描述》习题2.6

    <数据结构与算法分析-C语言描述>([url=http://users.cis.fiu.edu/~weiss/#dsaac2e]Data Structures and Algorithm ...

  4. 算法 c语言实现 英文版 pdf,数据结构与算法分析++C语言描述++英文版++..pdf-得力文库...

    数据结构与算法分析++C语言描述++英文版++....pdf General Ination 书名数据结构与算法分析 C语言描述 英文版 第2版 作者(美)韦斯著 页数512 出版社机械工业出版社 出 ...

  5. s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...

    <数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...

  6. c语言 循环赛日程表 n=2^k,循环赛日程表分治算法(c语言)

    /* * 设有n=2k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: * 每个选手必须与其他n-1个选手各赛一次: * 每个选手一天只能参赛一次: * 循环赛在n-1天内结束. * ...

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

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

  8. 网球循环赛分治算法c语言,【算法作业】 循环赛问题 分治算法

    题目: 设有N个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表 (1)每个选手必须与其他n-1个选手各赛一次 (2)每个选手一天只能赛一次 (3)当n是偶数,循环赛进行n-1天,当n是奇数, ...

  9. python做项目日程表_Flask框架搭建一个日程表

    前言 用Flask框架,SQLalchemy,SQlite 和Vertabelo 搭建一个日程表. 这个并不是最终产品,目的是展示python web开发的流程,欢迎不吝赐教! github下载源码 ...

最新文章

  1. Git 的安装及配置
  2. 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
  3. SUID、SGID、粘滞位
  4. 3dmax模型导入UE4
  5. c++ 二次开发 良田高拍仪_高拍仪进行二次开发要求
  6. 基于PaddleOCR史上最全车牌号识别实现(二)
  7. MATLAB符号运算小技巧
  8. 『论文笔记』目标追踪结合相关滤波器资料收集+机器学习基础知识补充!
  9. PC端微信图片的解密
  10. 心理咨询类_微信小程序项目实战、含:标注图、效果图、视频、源码
  11. 二叉树的左视图和右视图
  12. 网络带宽和速度的关系
  13. pyshark.tshark.tshark.TSharkNotFoundException: TShark not found.
  14. java学习笔记————SSH
  15. 多重纹理——像素着色器
  16. 计算机科学期刊催稿,SOFT COMPUTING
  17. 原画设计咨询回复话术
  18. 使用python脚本和excel对比Telegram多国语言包资源
  19. Python实战案例,mplcyberpunk模块,Python实现赛博朋克数据可视化
  20. ppu与spu之间的邮箱通信

热门文章

  1. 上海市婴幼儿社保卡领取办法
  2. 哪个网站云服务器最便宜,哪家云服务器比较便宜
  3. Android 接入融云案例
  4. [莫比乌斯反演]莫比乌斯函数
  5. Pycharm报错之“CreateProcess error=2, 系统找不到指定的文件”
  6. 通用高校排课算法研究
  7. 什么是软件工程-基础概念
  8. Python爬虫--人人网模拟登录cookie(四)
  9. quotacheck: Cannot create new quotafile /data/aquota.group.new: Permission denied
  10. 魅族回应被吉利收购:已签署协议;腾讯下架QQ影音所有版本;PyPI多个软件包因拼写错误包含后门|极客头条...