循环赛日程表(循环赛表格制作)

循环赛日程表(循环赛表格制作)

循环赛日程表(循环赛表格制作)

问题说明

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

(1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次。

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

功能说明

本程序运用分治的思想,实现了循环赛日程安排问题的求解, 生成日程表,输出。

代码简述

通过用户输入数据,程序输入检测,动态分配空间, 调用生成日程表函数,显示输出。

其中,生成日程表函数运用分治的思想,分成separate份, 先安排第一行(第一份),然后每一份填充,最终求解完毕, 生成日程表。

源码示例

#include <iostream>
#include <math.h>

using namespace std;

// 循环赛日程安排函数声明
void MatchTable(int k, int n, int **table);

int main()
{
	int n = 0, k = 0;

	// 用户界面
	cout << "---------------- 循环赛日程安排问题 ----------------" << endl;
	cout << "请输入k(k>=0),构成 n=(2^k) 个选手的循环赛" << endl;

	// 输入k值
	cin >> k;

	// 判断输入数据合法性,包括检查输入是否为数字,k值是否大于0
	if (cin.fail() || k < 0)
	{
		cout << "输入k错误!" << endl;
		system("pause");
		return 0;
	}

	// 计算比赛日程表大小
	n = pow(2, k);

	// 分配日程表空间
	int **table = new int *[n + 1];
	for (int i = 0; i <= n; i++)
	{
		table[i] = new int[n + 1];
	}

	// 进行循环赛日程安排,生成日程表
	MatchTable(k, n, table);

	// 显示输出
	cout << "------------------------------------------------" << endl;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			cout << table[i][j] << "\t";
		}
		cout << endl;
	}
	cout << "------------------------------------------------" << endl;

	// 暂停查看结果
	system("pause");

	// 释放内存
	for (int i = 0; i <= n; i++)
		delete[] table[i];
	delete[] table;

	// 指针置空
	table = NULL;

	return 0;
}

// 进行循环赛日程安排,生成日程表
void MatchTable(int k, int n, int **table)

   
循环赛日程表(循环赛表格制作)
{ // 设置日程表第一行的值 for (int i = 1; i <= n; i++) table[1][i] = i; // 每次填充的起始填充位置 int begin = 1; // 用分治法分separate份,循环求解 for (int separate = 1; separate <= k; separate++) { // 日程表进行划分 n /= 2; // flag为每一小份的列的标记 for (int flag = 1; flag <= n; flag++) { // 操作行 for (int i = begin + 1; i <= 2 * begin; i++) { // 操作列 for (int j = begin + 1; j <= 2 * begin; j++) { // 把左上角的值赋给右下角 table[i][j + (flag - 1) * begin * 2] = table[i - begin][j + (flag - 1) * begin * 2 - begin]; // 把右上角的值赋给左下角 table[i][j + (flag - 1) * begin * 2 - begin] = table[i - begin][j + (flag - 1) * begin * 2]; } } } // 进入日程表的下一个划分进行填充 begin *= 2; } }

今天的分享就到这里了,大家要好好学C++哟~

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

循环赛日程表(循环赛表格制作)

编程学习视频分享:

循环赛日程表(循环赛表格制作)

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/24034.html

(0)
上一篇 2023-08-26 14:30
下一篇 2023-08-26 16:30

相关推荐

  • 阿里巴巴mysql面试_阿里面试

    阿里巴巴mysql面试_阿里面试迎面走来了一个风尘仆仆的身穿格子衫的男子,手里拿着一个MacBook Pro,看着那稀少的发量,和那从容淡定的眼神。 我心里一颤,我去,这是架构师,架构师来面我技术面,我心里顿时不淡定了,表面很稳实则心里慌得一批。 果然,他手里拿着我的简历,快速的扫了一下,然后用眼角余光看了一…

    2023-04-02
    133
  • 面向对象设计原则(面向对象设计的准则)

    面向对象设计原则(面向对象设计的准则)

    2023-10-24
    180
  • 阿里巴巴mysql面试_MySQL面试

    阿里巴巴mysql面试_MySQL面试迎面走来了一个风尘仆仆的身穿格子衫的男子,手里拿着一个MacBook Pro,看着那稀少的发量,和那从容淡定的眼神。 我心里一颤,我去,这是架构师,架构师来面我技术面,我心里顿时不淡定了,表面很稳实则心里慌得一批。 果然,他手里拿着我的简历,快速的扫了一下,然后用眼角余光看了一…

    2023-05-23
    136
  • 数学笔记怎么做比较好_板书主板书写在哪一边

    数学笔记怎么做比较好_板书主板书写在哪一边数学课上,全程键盘手打1700页笔记。请看下图:不仅排版媲美教科书,而且还能够批注,检索关键词…笔记被他Po到网上之后,便引来大量围观。

    2022-12-14
    151
  • launchctl(launcher activity)

    launchctl(launcher activity)

    2023-10-24
    142
  • 【计算机网络】网络基础

    【计算机网络】网络基础@TOC 1. 网络发展 计算工作是不可能一个科学家搞出来的,注定是一群科学家协同工作, 给每一个科学家配上电脑,那么科学家之间的电脑也是协同工作的 人只要用计算机,计算机就必须要协同 古代打仗,每个

    2023-11-11
    138
  • mysql 图片_MySQL 2003

    mysql 图片_MySQL 2003之前两篇文章带你了解了 MySQL 的基础语法和 MySQL 的进阶内容,那么这篇文章我们来了解一下 MySQL 中的高级内容。 本文思维导图如下。 我们知道,MyISAM 和 MEMORY 存储引擎支持表级锁定(table-level locking),InnoDB 存储引擎…

    2023-04-02
    140
  • 如何获取Java中的当前堆栈跟踪?

    如何获取Java中的当前堆栈跟踪?- theme: channing-cyan – 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情 **“如何获取Java中的当前堆栈跟踪

    2023-11-17
    138