原文链接
单循环赛,是指所有参赛队伍都需跟其他队伍比赛一次,根据比赛得分,胜负场次来排列名次。比赛队伍为单数时,轮数等于队伍数,为双数时,轮数等于队伍数减一。如5支队伍需比赛5轮,6支队伍需比赛5轮。

首先介绍下逆时针轮转法。将队伍用阿拉伯数字从1开始编号,编排时将参赛队伍平均分成左右两排,左边从1开始自上向下排,右边按号数自下向上排,形成一个U型结构。如果队伍数为奇数,则在最后加一个“0”,凑成偶数。与0比赛的队伍该轮轮空。假设现在有7支队伍参赛,加上一个0,凑成8支。根据前面所述排列好队伍,然后将左右两排分别平行连线,就形成第一轮比赛的编排表,即1-0,2-7,3-6,4-5,队伍1在该轮轮空。第二轮开始,固定左上角的数字1,其余的数字想象成一个环,按逆时针方向移动一个位置,就形成第二轮的编排表。以此类推,每一轮移动一个位置,生成剩余轮次的编排表。最终形成的编排表如下:

一 二 三 四 五 六 七

1—0 1—7 1—6 1—5 1—4 1—3 1—2

2—7 0—6 7—5 6—4 5—3 4—2 3—0

3—6 2—5 0—4 7—3 6—2 5—0 4—7

4—5 3—4 2—3 0—2 7—0 6—7 5—6

仔细观察,会发现从第4轮开始,队伍6总是跟上一轮轮空的队伍比赛,这就是逆时针轮转法的缺点,即第二轮的轮空队从第四轮开始,每轮都与前一轮的轮空队伍比赛。

贝格尔编排法与逆时针轮转法类似,不过有两个区别。一是交替固定最大的数字(或者0)在左上角和右上角,当前轮次在左上角,则下一轮固定到右上角。二是固定最大数字(或者0)后,剩余的数字想象成一个环,移动一定间隔,这个间隔根据队伍数决定:

队伍数 间隔数

<=4 0

5 - 6 1

7 - 8 2

9 -10 3

11-12 4

13-14 5

… …

假设有n(n>=4)支队伍参赛,则间隔数的计算公式为(n+n%2-4)/2。

同样以7支队伍参赛为例,首轮还是

1 - 0

2 - 7

3 - 6

4 - 5

第二轮将0移到左上角,剩下的数字从1开始逆时针移动2个间隔,这里1将移到原来4所在的位置

第三轮将0移动到右上角,剩下的数字继续逆时针移动2个间隔

剩下的轮次原理同上,最终编排表如下

代码实现的思路如下,最大数字的位置只需根据前一轮的位置就能确定,其他数字都是按顺序排列,形成一个有序的环。所以只需要确定1的位置,其他位置的数字都能确定。将位置按照第一轮的数字编号为1-8。在第一轮,1在位置1上。第二轮,1移动2个间隔,可以理解成移动3个位置,即1+3=4,取模一下,(1+3)%7=4,所以1将移到位置4。第三轮,继续移动3个位置,(4+3)%7=0,这里0就是7,也就是1移到位置7。第四轮,(7+3)%7=3,1移到位置3。以此类推。要注意的是,要是1移到的位置跟0冲突,就移到相对位置。0在位置8,那么1就移到位置1,0在位置1,1就移到位置8。

运行效果

代码实现

#include <iostream>
using namespace std;
void BegerArrangement(int nAmount)
{if (nAmount < 2 || nAmount > 90)return;// 队伍数量int nFixAmount = nAmount;// 最后一支队伍的编号int nLastPlayerNo = nAmount;// 奇数队伍,补上一支虚拟的队伍,最后一支队伍的编号为0if (nAmount % 2){++nFixAmount;nLastPlayerNo = 0;}// 轮数int nMaxRound = nFixAmount - 1;int nHalfAmount = nFixAmount / 2;// 移动的间隔int nStep = nFixAmount <= 4 ? 1 : (nFixAmount - 4) / 2 + 1;int nRound = 1;int nFirstPlayerPos = 1;int nLastPlayerPos = 1;int result[100][200] = {0};while (nRound <= nMaxRound){// 每次最后一个玩家的位置需要左右对调nLastPlayerPos = nFixAmount + 1 - nLastPlayerPos;if (nRound == 1)nFirstPlayerPos = 1;elsenFirstPlayerPos = (nFirstPlayerPos + nStep) % (nFixAmount - 1);if (nFirstPlayerPos == 0)nFirstPlayerPos = nFixAmount - 1;if (nFirstPlayerPos == nLastPlayerPos)nFirstPlayerPos = nFixAmount + 1 - nLastPlayerPos;for (int i = 1; i <= nHalfAmount; ++i){int nPos[2] = {i, nFixAmount - i + 1};int nPlayer[2] = {0, 0};for (int j = 0; j < 2; ++j){if (nPos[j] == nLastPlayerPos)nPlayer[j] = nLastPlayerNo;else if (nPos[j] < nFirstPlayerPos)nPlayer[j] = nFixAmount - nFirstPlayerPos + nPos[j];elsenPlayer[j] = nPos[j] - nFirstPlayerPos + 1;result[i - 1][(nRound - 1) * 2 + j] = nPlayer[j];}}++nRound;}for (int i = 1; i <= nMaxRound; ++i){if (i == 1)printf("%3s%-3d|", "r", i);elseprintf("%4s%-3d|", "r", i);}printf("\n");for (int i = 0; i < nHalfAmount; ++i){for (int j = 0; j < nMaxRound; ++j){printf("%-2d-%2d | ", result[i][j * 2], result[i][j * 2 + 1]);}printf("\n");}printf("\n\n");
}
int main()
{int n;cin >> n;BegerArrangement(n);return 0;
}

代码思路,编辑格式不易,大家觉得还可以可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,https://motongxue.gitee.io

单循环赛 贝格尔编排法实现相关推荐

  1. 单循环赛贝格尔编排法实现

    单循环赛,是指所有参赛队伍都需跟其他队伍比赛一次,根据比赛得分,胜负场次来排列名次.比赛队伍为单数时,轮数等于队伍数,为双数时,轮数等于队伍数减一.如5支队伍需比赛5轮,6支队伍需比赛5轮. 首先介绍 ...

  2. C# “贝格尔”编排法

    采用"贝格尔"编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以"0"表示形成双数),前一半由1号开始,自上而下写在左边:后一半的数自下 ...

  3. 贝格尔编排法的PHP实现

    //贝格尔编排法的PHP实现public function berger(){set_time_limit(0);$n = 14; //队伍数if ($n%2==0) {$m=$n;}else{$m= ...

  4. PHP赛事贝格尔编排法--双循环

    //贝格尔编排法 function berger(){     // 双循环 // 根据队伍数量生成数组         $num = 10;         $ar = [];         fo ...

  5. PHP赛事贝格尔编排法--单循环

    //贝格尔编排法 function berger(){     //单循环     // 根据队伍数量生成数组         $num = 10;         $ar = [];         ...

  6. 贝格尔编排法之C++版

    轮转的步骤与之前的java代码不同,相对之前的更高效一些. // #include <iostream> #include<vector> using namespace st ...

  7. 贝格尔编排法-java

    2019独角兽企业重金招聘Python工程师标准>>> import java.util.Scanner; /*** 精简算法* @author jie**/ public clas ...

  8. 脑电波之父:汉斯·贝格尔_深度学习,认识聪明的汉斯

    脑电波之父:汉斯·贝格尔 Around 1900, a German farmer made an extraordinary claim: he had taught a horse basic a ...

  9. python求解运输问题_【Python实现】运输问题的表上作业法:利用伏格尔 (Vogel) 法寻找初始基可行解...

    #运输问题求解:使用Vogel逼近法寻找初始基本可行解 import numpy as np import pandas as pd import copy #定义函数TP_vogel,用来实现Vog ...

  10. 数值计算方法(三)——变步长梯形法与龙贝格算法

    变步长梯形算法 提出背景: 复化求积公式虽然能提高精度,但需要给出步长,步长精度太大则精度低,步长太小则计算量大,难以找到一个合适的步长(划分成的小区间的个数) 算法描述: 1.对所有已存在的子区间进 ...

最新文章

  1. 带参数的方法;导入包
  2. 远程管理Hyper-V Server 虚拟机
  3. python 多进程multiprocessing进程池pool tensorflow-yolov3 报错 MemoryError
  4. Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。
  5. 综合模拟试题计算机指南,综合全国计算机文管二级模拟试题.doc
  6. python 参数收集_Python3基础 函数 收集参数(tuple)+普通参数 的示例
  7. JavaScript学习指南 修订版pdf
  8. 如何搭建靠谱的测试环境
  9. Microsoft Office公式编辑器(CVE-2017-11882)漏洞分析报告
  10. Hadoop虚拟机镜像
  11. 怎么查看正在连接的无线网密码
  12. 3991: [SDOI2015]寻宝游戏
  13. CMM(Capability Maturity Model) 能力成熟度模型
  14. 使用chrome设置代理,果然还是linux 方便呢。想安装一个chrome的插件,通过命令设置代理。
  15. python爬虫有趣的应用软件_Python学习,爬虫不一定非要抓数据,也可以做自己喜欢的应用程序...
  16. c语言 数字翻译成英文,100数字翻译成英语?
  17. 一个数据库超全,支持免费高速下载专利的资源库--欧洲专利局Espacenet
  18. 上士闻道,勤而行之,但是却得不到外界的认可, 怎么说?
  19. 使用百度云的图像识别
  20. Windows统计分析进程流量工具AppNetworkCounter

热门文章

  1. csdn怎样注册?不想用微信
  2. JAVA编写飞机大战---分析过程及源代码(超详细超完整)
  3. (完整版)c语言初学必背代码
  4. 中兴B860AV1.1_机顶盒_(4G和8G版)刷机固件升级和教程
  5. tar bz2 解压
  6. FreeRTOS 教程指南 学习笔记 第二章 内存管理
  7. PTA 7-6 2048游戏模拟(1)--单行向左移动叠加
  8. 字体的基础知识:中文字体的特征
  9. 安装GitHub安装步骤
  10. 65nm工艺下MOM电容详解与蒙特卡洛仿真及calibre xRC