循环赛日程安排(C语言)
问题:
(先声明一点,下面我写了两种代码,但是都只能满足 队伍数 = 2的幂次方 的情况)
一年一度的欧洲冠军杯马上就要打响,在初赛阶段采用循环制,设共有n队参加,初赛共进行(n-1)天,每队要和其他各队进行一场比赛。要求每队每天只能进行一场比赛,并且不能轮空。请按照上述需求安排比赛日程,决定每天各队的对手。
对问题的理解
- 根据排列组合,n 个队伍总共要比赛 n(n-1)/2 场
- 初赛共进行(n-1)天,那么显而易见每天要比赛 n/2 场
- 显而易见,会看出一个问题来:这样的话,n 必须为偶数(因为比赛的场数得为整数)
扩充:
- 若n为奇数会怎么样?
- 首先,n队参加,由于每队每天只能进行一场比赛,则至少要比赛(n-1)天,这个很容易理解
- 已知n为奇数,比赛天数不能是(n-1)天
- 那么,若比赛天数为 n 天,则每天要比赛 (n-1)/2 场,这样就没问题了
循环赛日程有这么一个规律:
- 若比赛队数:n恰好为 2的k次方
- 则可以直接使用分治算法解决这个问题
若 n = 2
- 第一列的属性是队伍名
- 第二列属性是 第一天
- 第一行第二个,表示 1 打 2
- 第二行第二个,表示 2 打 1
- 这两个表示的是一个意思,在循环表中
若 n = 4 - 第一列是属性
- 第二列到第四列分别代表:第一天到第三天
- 比如第一行第4个,表示在第三天,1打4
以此类推…
可以看出,在表格中
- 左上角 = 右下角
- 左下角 = 右上角
- 规律从 n = 2 开始就成立
- 所以可以用分治算法解决这问题
此代码只适用于 队伍数 = 2的幂次方的
#include<iostream>
#include<stdio.h>
using namespace std;#define MAXSIZE 64 //暂时允许的最多的参赛队伍数量
int a[MAXSIZE][MAXSIZE]; //将比赛情况放在这个二维表中 int GameTable(int n,int k){if(n == 2){ //子问题足够小时a[k][0] = k+1;a[k][1] = k+2;a[k+1][0] = k+2;a[k+1][1] = k+1;} else{GameTable(n/2,k); //划分子问题GameTable(n/2,k+n/2);for(int i = k; i < k+n/2; i++){ //填充二维表的右上角for(int j = n/2; j < n; j++){a[i][j] = a[i+n/2][j-n/2];}}for(int i = k+n/2; i < k+n; i++){ //填充二维表的右下角for(int j = n/2; j < n; j++){a[i][j] = a[i-n/2][j-n/2];}}}
} int main(){int n; //队伍数 cout<<"please input the number of participating teams(2的幂次方,2到64):";cin>>n;GameTable(n,0); cout<<"编号 "; for(int i = 1; i <= n; i++)cout<<"第"<<i<<"天 "; cout<<endl;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){printf("%4d",a[i][j]);}cout<<endl;}
}
若一时间不太了解安排循环赛日程中的规律:
管他呀的,直接暴力破解,三重for循环搞起
- 下面的代码我想了很久,还是只能做到对 n = 2的幂次方 的情况
- 当n为其他情况时,按下面代码分配一定会造成遗漏,循环表分配是不正确的
#include<iostream>
#include<string.h>
using namespace std;#define MAXSIZE 64 //暂时限定队伍最大的数量 int main(){while(1){int team[MAXSIZE+1][MAXSIZE+1], //team不使用下标为零的空间//team存放已比赛过的队伍 op[MAXSIZE/2][2],//用来输出当天的比赛情况 s[MAXSIZE]; //用来检验当日已比赛的队伍 int num; //参赛队伍的数量int t;do{cout<<"请输入参赛队伍的数量:"; cin>>num;}while(num < 2);memset(team,0,sizeof(team));for(int i = 1; i < num; i++){ memset(s,0,sizeof(s)); memset(op,0,sizeof(op));t = 0;for(int j = 1; j <= num; j++){ //表示第i天的第j支队伍的比赛情况 if(s[j] == 0){for(int k = j+1; k <= num; k++){ //k表示和j配对的对手 if(team[j][k] == 1 || s[k] == 1)continue;op[t][0] = j;op[t++][1] = k;s[k] = 1;team[j][k] = 1; break;}}if(t == num/2)break; //每天比赛场数满了,进入下一天 } cout<<"第"<<i<<"天:";for(int p = 0; p < t; p++)cout<<"("<<op[p][0]<<","<<op[p][1]<<") ";cout<<endl;}
}
}
参考资料:
《算法学习与应用 从入门到精通》张玲玲
分治法——循环赛日程安排问题
算法训练 比赛安排
分治法:循环赛日程安排问题
循环赛日程安排(C语言)相关推荐
- 循环赛日程安排问题(分治法)
问题描写叙述: 设有n(n=2^k)支队伍參加循环赛,循环赛共进行n-1天,每支队伍要与其它n-1支队伍比赛一场, 且每支队伍每天必须比赛一场,不能轮空.试按此要求为比赛安排日程. 算法思路: 我们先 ...
- 循环赛 c语言,循环赛日程安排问题(分治法)
问题描述: 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. 按此要求,可将比赛日程表设计成一 ...
- 分治法:循环赛日程安排问题
问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表: 1)每个选手必须与其它n-1个选手各赛一次: 2)每个选手一天只能赛一次. 分析,按照上面的要求,可以将比赛表设计成一个n行 ...
- java 循环赛问题_算法——循环赛日程安排问题
一.问题背景 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: ①每个选手必须与其他n-1个选手各赛一次: ②每个选手一天只能赛一次. 二.问题分析 按此要求,可将比赛日程表 ...
- 【C语言】【分治算法】循环赛日程安排问题
题目要求 设有 n = 2 k n=2^{k} n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. ...
- 循环赛日程安排(构造、分治)
问题描述 N支队伍进行比赛,要求: 任意两支队伍交且仅交过一次手 每天每支队伍至多打一场比赛 比赛尽快完成 问题等价于构造一个N×M矩阵,表示N支队伍比赛M天,第一列固定为1到N,表示每支队伍的编号, ...
- 使用日程安排自动化测试来更好地管理时间与资源
简介:在一个自动化测试系统中按日程安排一项测试是实现在特定的日期和时间内执行任务的重要组成部分.它不但能够帮助您更有效地使用测试资源,而且能够帮助您监视测试结果.本文介绍了关于这方面一些应当考虑的事项 ...
- 用html完成编辑日程,10款jQuery实现对简洁大气的日程安排日历
1.基于jQuery实现的网站首页宽屏幻灯片 jQuery网站首页宽屏幻灯片代码是一款基于jquery+css3实现的带有弹性平滑动画切换效果的jquery特效,此段代码适应于所有想要的网页的使用,有 ...
- 识别和避免日程安排游戏
识别和避免日程安排游戏 给我一块石头 出资人总希望项目能更早完成. 有时出资人不会认同提出的每一个截止日期–总是离期望值很遥远 当出资人希望项目能更快交付但不告诉何时需要或为什么的时候就会玩 给我一块 ...
最新文章
- IOS学习笔记(四)之UITextField和UITextView控件学习
- outlook2007 未知错误,代码0x80040600解决方法
- php5.2的配置方,Windows IIS PHP 5.2 安装与配置方法
- python培训中心-【北京Python培训中心】
- 企业核心员工的长期激励计划
- 打破重重阻碍,Flutter 和 Web 生态如何对接?
- 猴子排圈求最后编号问题
- java显示目录文件列表和删除目录
- python文件读取每一行操作
- Asp.net性能优化-提高ASP.Net应用程序性能的十大方法
- php+mysql+like+通配符+变量
- Java进制转换问题(详解)
- Unity之FBX文件操作学习笔记(二)SDK sample代码初探
- Nicolas Bourbaki 是何许人也,下一个中本聪?
- 如果在遨游浏览器里设置Bing(必应)搜索为默认搜索
- 我的(此)电脑里面除了磁盘以外,多了一个CD驱动器,删除方法,亲测有效
- 10.2-控制单元CU的微程序设计
- 如何在WORD中插入可播放的视频
- Linux 安装Mysql8.0.15教程,以及修改密码
- URL 重写就是把URL地址重新改写(汗^_^)。
热门文章
- python-django解决浏览器中文文件名乱码下载不出来文件的问题
- 在红帽Linux上安装samba服务,如何在linux上安装配置samba服务器
- php打乱扑克牌方法,19.8秒记忆一副打乱的扑克牌,用这个方法你也可以!
- 新唐MCU开发流程解析:从MCU原型设计到样机测试
- C# 遗传算法 排课系统优化
- ADO CreateParameter 0xC0000005 错误原因及解决方法
- 影响LoRa网络传输距离的关键因素是什么?
- fan4801开关电源原理图_入门开关电源,这些原理图一定要读懂!
- java 生成md5 8位_Java生成MD5算法
- 大学物理实验怎么写,大学物理实验注意事项,实验报告怎么写