任意人数的循环赛日程表 分治 非分治 c++

循环赛日程表

要求

设计一个满足以下要求的比赛日程表:

  • 每个选手必须与其他n-1个选手各赛一次;
  • 每个选手一天只能赛一次;
  • 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环赛进行n天;

举例 4位选手的循环赛日程表
1572687051484

蓝色部分为运动员编号。

第1行表示1号运动员第1天与2号比赛,第2天与3号比赛,第3天与4号比赛

非分治方式解决

规律

  1. 以6个选手为例,先写下表头。
    1572685575963

  2. 从对角线往上依次填入2到6,自己打自己的情况空着。
    填第一行
    1572685951202
    填完上半部分
    1572686077334

  3. 空着的填入最大值6.同时同一天,谁与6比赛,6也在同一天与他比赛,故填入最大值的同时补全最后一行。
    1572686816768

  4. 填完下半部分,除了最后一行。从对角线开始往下,从5到3,重复的填入最大的运动员,这里为6.
    1572686893434

代码实现

如果是奇数的话,将运动员加1作为偶数处理,然后无论谁轮到序号最大的运动员都轮空。

所以只考虑偶数的情况。

//n为运动员数量,table为日程表
int roundRobin(int n,int** table)
{
   
	//填右上角
	for (int i = 0; i < n; i++)
		for (int k = i, j = 0; k < n; k++, j++)
			if (j == i)
			{
   				//自己打自己的情况
				table[j][k] = n - 1;
				table[n - 1][k] = j;
			}
			else
				table[j][k] = i;
	//填左下角
	for (int i = n - 2; i >= 0; i--)
		for (int j = n - i - 1, k = 0; j < n-1; k++, j++)
			if (j == i)
			{
   
				table[j][k] = n - 1;
				table[n - 1][k] = j;
			}
			else
				table[j][k] = i;
	//填第一列
	for (int i = 0; i < n
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值