篮球分组问题讨论

article/2025/7/5 10:45:45

1 问题概述

问题:有5支球队在同一块场地上进行单循环赛,共要进行10场比赛。下表是一个赛程安排,有些队觉得不公平。研究以下问题


 

A

B

C

D

E

每两场比赛间相隔场次数

A

X

1

9

3

6

1, 2, 2

B

1

X

2

5

8

0, 2, 2

C

9

2

X

7

10

4, 1, 0

D

3

5

7

X

4

0, 0, 1

E

6

8

10

4

X

1, 1, 1

然后我们不难看到左边的数字有的人比赛1场之后休息一场,但是有的球队是比赛1场之后就休息4场,这明显很不公平,接下来我们要研究的是,我们要怎么进行分配才可以最合适

比赛5场 只可以有1,2间隔场次
比赛6场 只可以有1,2,3间隔场次
比赛7场 只可以有2,3间隔场次
比赛8场 只可以有2,3,4间隔场次......依次类推


我们先来想想思路
我们要去解决一个实际问题,而不是一个数学游戏,所以我们要按照实际情况去考虑

一开始我的思路是观察对角线等的规律在做这一道题目,这就是错误的思路,因为我们是解决实际问题,而不是去做数字游戏,所以我们要按照场次进行分配,就是分配给该给的组别

当我们在排场次的时候,我们排完1之后,由于我们是5场,间隔是要为1,2的,所以不可以再把2排到第一行和第二行了

要把2放到第二行的下面

然后我们只需要根据这个思路进行编程就好了

2 代码思路

代码示例

global mymap found n;
mymap = zeros(20,20);
found = false;function printf()global mymap nfor i = 1:nfor j = 1:nif i == jfprintf('X\t');elsefprintf('%d\t', mymap(i,j));endendfprintf('\n');end
endfunction valid = isvalue(idx, m, w)global mymap nmatches = [];for j = 1:nif idx ~= j && mymap(idx, j) > 0matches = [matches, mymap(idx, j)];endendif length(matches) < 2valid = true;return;endmatches = sort(matches);for i = 1:length(matches)-1diff = matches(i+1) - matches(i) - 1;if diff ~= m && diff ~= wvalid = false;return;endendvalid = true;
endfunction fillMap(m, w, current)global mymap found n;if foundreturn;end% 如果所有比赛都安排完毕,打印结果并返回if current > (n * (n - 1)) / 2found = true;printf();return;end% 计算当前各队伍的最大比赛编号currentmax = max(mymap, [], 2);% 优先尝试与 currentmax 相关的队伍for i = 1:n% 如果 currentmax(i) 不为 0,检查间隔是否合法if currentmax(i) > 0interval = current - currentmax(i) - 1;if interval ~= m && interval ~= wcontinue;  % 不合法,跳过endend% 遍历所有可能的对手 jfor j = i+1:nif mymap(i,j) == 0  % 如果这个位置还没填% 尝试填入 currentmymap(i,j) = current;mymap(j,i) = current;% 检查是否满足约束if isvalue(i, m, w) && isvalue(j, m, w)fillMap(m, w, current + 1);  % 递归填下一个数end% 如果找到解,直接返回if foundreturn;end% 否则回溯,恢复 mymapmymap(i,j) = 0;mymap(j,i) = 0;endendend
end% 主程序
n = input('篮球队伍的个数: ');
m = input('间隔1: ');
w = input('间隔2: ');mymap = zeros(n,n);
for i = 1:nmymap(i,i) = -1;
endfillMap(m,w,1);


代码1

function printf()global mymap nfor i = 1:nfor j = 1:nif i == jfprintf('X\t');elsefprintf('%d\t', mymap(i,j));endendfprintf('\n');end
end

这个是打印函数
就是我们按照我们表格那种进行打印这个球队的分组
然后利用fprintf进行格式化处理,如果用dist的话用不了'\t',这样就格式化不了了
这个函数十分的简单,就是简答的for循环而已

代码2

function valid = isvalue(idx, m, w)global mymap nmatches = [];for j = 1:nif idx ~= j && mymap(idx, j) > 0matches = [matches, mymap(idx, j)];endendif length(matches) < 2valid = true;return;endmatches = sort(matches);for i = 1:length(matches)-1diff = matches(i+1) - matches(i) - 1;if diff ~= m && diff ~= wvalid = false;return;endendvalid = true;
end

这个是检查函数,就是判断是否满足我们的间隔为
首先我们声明一下这两个全局变量,然后就是不断地把这个元素放到一个数组里面,然后进行排序,然后不断地进行相减得到之间地间隔,然后就进行判断就可以了,只要有一个不过,那么后面的就直接return

代码3

function fillMap(m, w, current)global mymap found n;if foundreturn;end% 如果所有比赛都安排完毕,打印结果并返回if current > (n * (n - 1)) / 2found = true;printf();return;end% 计算当前各队伍的最大比赛编号currentmax = max(mymap, [], 2);% 优先尝试与 currentmax 相关的队伍for i = 1:n% 如果 currentmax(i) 不为 0,检查间隔是否合法if currentmax(i) > 0interval = current - currentmax(i) - 1;if interval ~= m && interval ~= wcontinue;  % 不合法,跳过endend% 遍历所有可能的对手 jfor j = i+1:nif mymap(i,j) == 0  % 如果这个位置还没填% 尝试填入 currentmymap(i,j) = current;mymap(j,i) = current;% 检查是否满足约束if isvalue(i, m, w) && isvalue(j, m, w)fillMap(m, w, current + 1);  % 递归填下一个数end% 如果找到解,直接返回if foundreturn;end% 否则回溯,恢复 mymapmymap(i,j) = 0;mymap(j,i) = 0;endendend
end
% 如果所有比赛都安排完毕,打印结果并返回if current > (n * (n - 1)) / 2found = true;printf();return;end

这个上面的公式是怎么推算出来的呢?

我们来看这个五角星的部分,1+2+3+4,这就是一个典型的等差数列,然后我们只需要用等差数列的求和公式就可以计算出这个结果是多少,然后就得出了这个公式,n代表的是有几个队伍

  1. 参数情况
    • 第一个参数mymap代表输入的矩阵。
    • 第二个参数[]是 MATLAB 里的惯用写法,意思是不进行比较操作。
    • 第三个参数2表明按行方向(也就是按列)来计算最大值。

我们获取每一个队伍的最大值之后,就进行循环,因为我们可以根据间隔来进行填数字了

然后我们就进行判断

 if currentmax(i) > 0interval = current - currentmax(i) - 1;if interval ~= m && interval ~= wcontinue;  % 不合法,跳过endend

这个是判断这个如果放入这个数字之后,在当前队伍的间隔满不满足,然后不合法的就直接跳过

 % 遍历所有可能的对手 jfor j = i+1:nif mymap(i,j) == 0  % 如果这个位置还没填% 尝试填入 currentmymap(i,j) = current;mymap(j,i) = current;% 检查是否满足约束if isvalue(i, m, w) && isvalue(j, m, w)fillMap(m, w, current + 1);  % 递归填下一个数end% 如果找到解,直接返回if foundreturn;end% 否则回溯,恢复 mymapmymap(i,j) = 0;mymap(j,i) = 0;endendend

然后我们再继续遍历每一个对手把当前按值填到对应的map里面,然后判断是否满足约束条件,然后满足就递归到下一个,没有就回溯


http://www.hkcw.cn/article/rEotmkPeJA.shtml

相关文章

成都鼎讯--通信干扰设备功能全解析

在现代电子战与通信对抗领域&#xff0c;一款高性能的通信干扰设备是掌握电磁频谱主动权的关键。本文将深入解析一款先进的通信干扰设备&#xff0c;其凭借多频段覆盖、多通道并行、多样化调制方式及灵活供电等特性&#xff0c;成为部队、科研院所等机构在电磁对抗训练与研究中…

vscode中让文件夹一直保持展开不折叠

vscode中让文件夹一直保持展开不折叠 问题 很多小伙伴使用vscode发现空文件夹会折叠显示, 让人看起来非常难受, 如下图 解决办法 首先打开设置->setting, 搜索compact Folders, 去掉勾选即可, 如下图所示 效果如下 看起来非常爽 ! ! !

中国城市间地理距离矩阵(2024)

1825 中国城市间地理距离矩阵(2024) 数据简介 中国城市间地理距离矩阵数据集&#xff0c;通过审图号GS(2024)0650的中国城市地图在Albers投影坐标系中进行计算得出矩阵表格&#xff0c;单位为KM&#xff0c;方便大家研究使用。 中国城市地理距离矩阵数据通过计算城市中心距离…

Linux中的shell脚本

什么是shell脚本 shell脚本是文本的一种shell脚本是可以运行的文本shell脚本的内容是由逻辑和数据组成shell脚本是解释型语言 用file命令可以查看文件是否是一个脚本文件 file filename 脚本书写规范 注释 单行注释 使用#号来进行单行注释 多行注释 使用 : " 注释内容…

20250530-C#知识:抽象类、抽象方法、接口

C#知识&#xff1a;抽象类、抽象方法、接口 在开发过程中接口一般用得较多&#xff0c;程序框架往往定义一堆接口规范&#xff0c;然后程序员自己写逻辑来实现接口功能。掌握接口的知识还是很有必要的。 1、抽象类 用abstract关键字修饰的类不能用来实例化对象可以包含抽象方法…

韩国首尔一地铁车厢内遭纵火 乘客被紧急疏散

当地时间5月31日8时47分左右,韩国首尔地铁5号线一辆列车车厢内起火,乘客随后被紧急疏散。据初步调查,火灾原因为有人纵火,嫌疑人已被抓获。目前暂无人员伤亡报告。受火灾事件影响,该地铁线路部分区段一度暂停运行,首尔市交通部门10时13分通报,事故处理已经完毕,暂停运行…

跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用

JxBrowser 是 TeamDev 开发的跨平台库&#xff0c;用于在 Java 应用程序中集成 Chromium 浏览器。它支持 HTML5、CSS3、JavaScript 等&#xff0c;具备硬件加速渲染、双向 Java 与 JavaScript 连接、丰富的事件监听等功能&#xff0c;能处理网页保存、打印等操作&#xff0c;助…

聊聊网络变压器的浪涌等级标准是怎样划分的呢?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;聊聊网络变压器的浪涌等级标准是怎样划分的呢&#xff1f; 在和做防雷产品的客户的深度沟通网络变压器产品选型中发现&#xff1a;客户对网络变压器的浪涌等级划分也很希望有更深的了解&#xff0c;今天就这个问题和…

探索Air780EPM:N种GPIO控制LED的创新应用!

通过创新思维与实用技巧&#xff0c;本文将带你了解Air780EPM如何通过GPIO实现LED控制的N种可能&#xff0c;从简单到复杂&#xff0c;激发项目灵感。 一、GPIO直接驱动LED 1.1 适用场景 低功耗场景&#xff1a;LED电流 ≤ 5mA&#xff08;普通GPIO的驱动能力限制&#xff09;…

JS 事件循环详解

JS 事件循环详解 文章目录 JS 事件循环详解一、JS 的单线程模型与异步机制二、事件循环的核心组件1. 执行栈&#xff08;Call Stack&#xff09;2. 任务队列&#xff08;Task Queue&#xff09;3. Web APIs 三、事件循环的执行流程四、任务类型详解1. 宏任务&#xff08;Macrot…

堆遇到的stl与理论基础

目录 二叉完全搜索树是堆吗:并不是,堆比两孩子都大 1. 二叉完全搜索树的特点 2. 堆的特点 3. 两者的主要区别 4. 结论 c有swap吗 堆的向上调整和向下调整是什么 1. 堆的定义 2. 向上调整&#xff08;Heapify Up&#xff09; 操作步骤 示例&#xff08;最大堆&#x…

年度工作汇报工作总结PPT模版分享

年度工作汇报工作总结PPT模版分享&#xff1a;工作总结汇报类PPT模版https://pan.quark.cn/s/774660cc70e8

一文学会c++中的内存管理知识点

文章目录 c/c内存管理c语言动态内存管理c动态内存管理new/delete自定义类型妙用operator new和operator delete malloc/new&#xff0c;free/delete区别 c/c内存管理 int globalVar 1;static int staticGlobalVar 1;void Test(){static int staticVar 1;int localVar 1;in…

ZC-OFDM雷达通信一体化减小PAPR——直接限幅法

文章目录 前言一、直接限幅法技术1、简介2、原理 二、MATLAB 仿真1、核心代码2、仿真结果 三、资源自取 前言 在 OFDM 雷达通信一体化系统中&#xff0c;信号的传输由多个子载波协同完成&#xff0c;多个载波信号相互叠加形成最终的发射信号。此叠加过程可能导致信号峰值显著高…

【二维数组】

二维数组 需要掌握的知识二维数组与内存二维数组语法Arrays类的常用方法介绍如何实现冒泡排序 需要掌握的知识 二维数组与内存 二维数组语法 //数据类型【】【】数组; //或者 //数据类型 数组名【】【】&#xff1b; //二维数组初始化操作 int [][] scorenew int[][]{{90,85,92…

小黑大语言模型通过设计demo进行应用探索:langchain中chain的简单理解demo

chain简介 LangChain 中的 Chain 模块‌在开发大型语言模型&#xff08;LLM&#xff09;驱动的应用程序中起着至关重要的作用。Chain是串联LLM能力与实际业务的关键桥梁&#xff0c;通过将多个工具和模块按逻辑串联起来&#xff0c;实现复杂任务的多步骤流程编排。 案例 通过…

职坐标精选嵌入式AI物联网开源项目

随着嵌入式、AI与物联网技术的深度融合&#xff0c;开源生态已成为开发者构建智能硬件解决方案的核心驱动力。本文将从嵌入式实时操作系统、多模态AI数据集及物联网接入平台三大维度切入&#xff0c;系统性梳理技术选型要点与实践路径。在嵌入式领域&#xff0c;重点解析低功耗…

闻晓医考---口腔执业医师483分的复习攻略

&#x1f308;分清考试主次 &#x1f386;核心: 口外(114分) 口修(112分) 牙体牙髓(72分) &#x1f386;重点: 口预(50分) 临床医学(49分) 口组病(33分) 口解(33分) 牙周(30分) &#x1f386;次重点: 儿口(16分) 口腔黏膜(16分) 免疫&#xff08;8分&#xff09;…

火语言UI组件--幻灯片

【组件功能】&#xff1a;在有限空间内&#xff0c;循环播放同一类型的图片、文字等内容。 样式预览 基础设置 属性名称属性释义输入值类型初始索引(initialIndex)设置初始状态激活的幻灯片的索引&#xff0c;从 0 开始数字型(Number)触发方式(trigger)设置指示器的触发方式(…

矿用电液控连接器LCFB-12钢丝编织橡胶护套连接器

矿用电液控连接器LCFB-12钢丝编织橡胶护套连接器是煤矿井下综采工作面液压支架电液控制系统中的关键部件,其性能直接关系到整个液压系统的稳定性和安全性。随着智能化采矿技术的快速发展,这类连接器的技术要求和应用场景也在不断升级。本文将从产品结构、技术特点、行业应用及…