【分治法】循环赛日程表问题 C\C++(附代码、实例)

问题描述

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

  1. 每位选手必须与其他n-1个选手各赛一次
  2. 每位选手一天只能赛一次
  3. 循环赛一个进行n-1天
  4. 选手人数 n = 2 k n=2^k n=2k

问题分析

下图是一种日程表的安排方式

在这里插入图片描述

观察上图,我们发现日程表左上角的四行四列和右下角的四行四列完全一致,左下角的四行四列和右上角的四行四列也完全一致

那么我们可以得到一个思路,就是将大日程表一分为二,对两部分分别安排日程,然后再复制到对应的其他位置,获得整个大日程表

下面来看一下该问题是否满足分治法的四个条件:

  1. 大问题可以分成规模小的小问题。对日程表进行划分后,只有问题规模变小了,仍然是相同问题
  2. 问题小到一定规模后可以很容易的解决。当日程表是1x1的大小时,自己不用和自己安排比赛,也就不用再分再填了
  3. 子问题的解可以合成大问题的解。得到子问题的答案后,将子日程表依次复制到对角位置,就得到了大日程表,也就得到了大问题的解
  4. 分解出的各子问题互相独立(不重复)

综上所述,该问题满足分治策略的四个条件,可以用分治法解决

所以这个问题的解决方法就是,将对n位选手安排日程表的问题分成对前n/2位选手和后n/2位选手分别安排日程,再对每部分递归的分割,直到只剩下一个选手

代码

void table(int i, int j, int n) {//i j为表左上角的行号和列号,n为选手个数
	if (n > 1) {
		table(i, j, n / 2);
		table(i + n / 2, j, n / 2);
		copy(i, j, i + n / 2, j + n / 2, n / 2);
		copy(i + n / 2, j, i, j + n / 2, n / 2);
	}
	else
		a[i][j] = i + 1;
}

table函数为a[i][j]a[i+n][j+n]的子表安排日程,如果该表的大小为1x1,就把当前选手编号填进去,如果表的大小大于1x1,就递归的调用自身,为a[i][j]a[i+n/2][j+n/2]a[i+n/2][j]a[i+n][j+n/2]的子表安排日程。再将安排好的日程表copy到对角部分

void copy(int x1, int y1, int x2, int y2, int n) {
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			a[i + x2][j + y2] = a[i + x1][j + y1];
}

copy函数很简单,就是将x1、y1 长度为n的日程表复制到x2、y2

实例

#include<stdio.h>
int a[8][8];
void copy(int x1, int y1, int x2, int y2, int n) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			a[i + x2][j + y2] = a[i + x1][j + y1];
		}
	}
}
void table(int i, int j, int n) {//i j为表左上角的行号和列号,n为选手个数
	if (n > 1) {
		table(i, j, n / 2);
		table(i + n / 2, j, n / 2);
		copy(i, j, i + n / 2, j + n / 2, n / 2);
		copy(i + n / 2, j, i, j + n / 2, n / 2);
	}
	else
		a[i][j] = i + 1;
}
int main() {
	int n = 8;
	table(0, 0, n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果
在这里插入图片描述

非递归方法

使用非递归的方法解决这个问题,思路是逐步将已得到的日程copy到对角的区域中

对于下图,方法就是先分别将1至8号复制到对角区域,再将橙色区域copy到对角的橙色区域,将黄色区域copy到对角的黄色区域,下半部分同理;再将1-4的大区域copy到对角的浅蓝色区域,5-8copy到对角的深蓝色区域。最后就得到了8x8的日程表
在这里插入图片描述

代码

int main() {
    int n;
    n = 8;

    // 初始化第一天的比赛
    for (int i = 0; i < n; i++) {
        a[i][0] = i + 1;
    }
    int len = 1;
    // 使用迭代方法填充日程表
    for (int j = 0; j < n; j += len) {
        for (int i = 0; i < n; i += len * 2) {
            copy(i, 0, i + len, len, len);
            copy(i + len, 0, i, len, len);
        }
        len *= 2;
    }

    // 打印日程表
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

运行结果
在这里插入图片描述

小结

使用分治法的注意事项

  1. 注意检查四个条件是否满足
  2. 尽量保证划分出的子问题规模大致一致
  3. 如果可以使用递推的方式解决问题,尽量使用递推算法
  4. 用递归算法解决问题时,要分析出其递归边界和递归方程

分治策略相关问题
线性时间选择问题
快速排序中的分治策略
棋盘覆盖问题
快速幂算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【第一节】C++设计模式(创建型模式)-工厂模式

目录 前言 一、面向对象的两类对象创建问题 二、解决问题 三、工厂模式代码示例 四、工厂模式的核心功能 五、工厂模式的应用场景 六、工厂模式的实现与结构 七、工厂模式的优缺点 八、工厂模式的扩展与优化 九、总结 前言 在面向对象系统设计中&#xff0c;开发者常…

基于windows的docker-desktop安装kubenetes以及dashboard

我们需要k8s环境做各种小实验可以本地安装一个&#xff0c;这里介绍win11如何通过docker-desktop安装k8s以及通过helm安装dashboard。 下载docker-desktop地址https://www.docker.com/get-started/打开【控制面板】->打开【启用和关闭windows功能】->分别勾选【hyper-v】…

vmware虚拟机Ubuntu Desktop系统怎么和我的电脑相互复制文件、内容

1、先安装vmware workstation 17 player&#xff0c;然后再安装Ubuntu Desktop虚拟机&#xff0c;然后再安装vmware tools&#xff0c;具体可以参考如下视频&#xff1a; VMware虚拟机与主机实现文件共享&#xff0c;其实一点也不难_哔哩哔哩_bilibili 2、本人亲自试过了&…

AIGC视频扩散模型新星:SVD——稳定扩散的Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓&#xff0c;而慕尼黑大学同样不容小觑&#xff0c;…

llama-factory部署微调方法(wsl-Ubuntu Windows)

llama-factory项目GitHub地址&#xff1a;GitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100 LLMs & VLMs (ACL 2024) wsl-Ubuntu&#xff1a; 1.获取项目 git clone https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factory/ 2.安装环境…

数据结构之【顺序表简介】

1.顺序表的概念 顺序表 是 用一段物理地址连续的存储单元 依次 存储数据元素的线性结构 一般情况下采用数组存储 2.顺序表的结构 既然顺序表可以用来存储数据元素&#xff0c; 那就少不了 增删查改 的操作 此时&#xff0c;单一地只创建数组满足不了上述操作 创建相应的结构…

基于Spring Boot的农产品智慧物流系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

具有整合各亚专科医学领域知识能力的AI智能体开发纲要(2025版)

整合各亚专科医学领域知识能力的AI代理的开发与研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量,医疗领域也不例外。近年来,AI 在医疗行业的应用取得了显著进展,从医学影像诊断到疾病预测,从药物研发到个性化医疗,AI 技…

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…

功能说明并准备静态结构

功能说明并准备静态结构 <template><div class"card-container"><!-- 搜索区域 --><div class"search-container"><span class"search-label">车牌号码&#xff1a;</span><el-input clearable placeho…

【华三】STP的角色选举(一文讲透)

【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图&#xff08;文字描述&#xff09;****2. 华三STP常用命令速查表** 文章总结 一、引言 在…

LangChain 技术入门指南:探索语言模型的无限可能

在当今的技术领域&#xff0c;LangChain 正逐渐崭露头角&#xff0c;成为开发语言模型应用的强大工具。如果你渴望深入了解并掌握这一技术&#xff0c;那么就跟随本文一起开启 LangChain 的入门之旅吧&#xff01; (后续将持续输出关于LangChain的技术文章,有兴趣的同学可以关注…

【设计模式精讲】创建型模式之原型模式(深克隆、浅克隆)

文章目录 第四章 创建型模式4.5 原型模式4.5.1 原型模式介绍4.5.2 原型模式原理4.5.3 深克隆与浅克隆4.5.4 原型模式应用实例4.5.5 原型模式总结 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 第四章 创建型模式 4.5 原型模式 4.5.1 原型模式介…

【uniapp*vue3】app/h5 webview通讯方案

本文旨在解决vue3版本下uniapp h5项目向app项目中webview通讯问题 问题产生于uniapp不支持vue3使用template.h5.html 自定义打包模板 h5向app发送信息 有很多文章指出h5项目使用uni.postmessage 这个api需要在template.h5.html引入一个js文件 然后改下webuni变量再从manifest.…

关于Bootstrap的前端面试题及其通俗易懂的答案解析

文章目录 1. 什么是Bootstrap&#xff1f;2. Bootstrap的主要特点有哪些&#xff1f;3. Bootstrap中的栅格系统是如何工作的&#xff1f;4. 如何在Bootstrap中创建一个按钮&#xff1f;5. 如何使一个元素在Bootstrap中可见或隐藏&#xff1f;6. Bootstrap中的导航栏是如何工作的…

POI优化Excel录入

57000单词原始录入时间258S 核心代码: List<Word> wordBookList ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);if (!CollectionUtil.isEmpty(wordBookList)) {for (Word word : wordBookList) {//逐条向数据库中插入单词wordMapper.insert(word);}…

重订货点和安全库存

重订货点 重订货点是指当库存水平下降到某个特定值时&#xff0c;系统会自动触发采购或生产订单。其目的是确保在物料消耗完之前&#xff0c;能够及时补充库存。 安全库存 安全库存是为应对未来物资供应或需求的不确定性因素&#xff08;如突发性订货、交货期突然延期等&…

axios post请求 接收sse[eventsource]数据的

axios 接收sse数据的 axios 接收sse数据的 EventSource什么 基于 HTTP 协议实现&#xff0c;通过与服务器建立一个持续连接&#xff0c;实现了服务器向客户端推送事件数据的功能。在客户端&#xff0c;EventSource 对象通过一个 URL 发起与服务器的连接。连接成功后&#xff0…

上帝之眼——nmap

nmap介绍 Nmap&#xff08;网络映射器&#xff09;是一款广受欢迎的网络探测和安全评估工具&#xff0c;被誉为“上帝之眼”。它以其强大的扫描功能和广泛的应用场景&#xff0c;成为系统管理员和安全专家手中的得力助手。本文将对Nmap进行详细介绍&#xff0c;包括其优点、基本…

Selenium实战案例1:论文pdf自动下载

在上一篇文章中&#xff0c;我们介绍了Selenium的基础用法和一些常见技巧。今天&#xff0c;我们将通过中国科学&#xff1a;信息科学网站内当前目录论文下载这一实战案例来进一步展示Selenium的web自动化流程。 目录 中国科学&#xff1a;信息科学当期目录论文下载 1.网页内…