因为时下的java程序员被骂素质差,
所以今日要发一个算法日志,证明我是懂算法的,汗......
这是我数据结构课程设计算法之一
(GDPU)课程设计问题描述:
说明:设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)循环赛一共进行n-1天。
设计要求:请使用C语言编程,设计一个有效的算法解决循环赛日程表问题。
网上能找到的答案是使用分治法,
我这里自己写的多边形匹配算法,其他地方没有现成代码能找到的
同时提供思想,和算法实现
实现方法一:多边形算法思想:
首先我们在循环赛中,要实现选手两两配对,因为每天选手只能参加一场比赛,
所以我们要设计一个配对方式既能够适宜计算机存储和运算,又能够高效解决问题的算法。
这里先给出算法策略:两两点匹配,并且匹配的每组点,相邻点的间隔不能相同
(如下图2)
编号1与编号2相邻,
编号3与编号5相隔一个点,
编号4与编号7相邻2个点
这时候,我们以多边形中心为轴,旋转8个点组成的多边形,
其中红线为配对线,不需要变化,
每转360度,代表一天的赛事,以各红线两端编号两两配对,
然而,这样的图设计不能完全覆盖所有的配对旋转时覆盖的路径,
因为剩下8与6,如果我们给它配对,但他们相邻也是1个点,跟3和5重复了
这时候,我们重新设计路径覆盖的配对,(如图3)
我们只要把其中的编号1移到中心轴,外圈是奇数点,
这样,先连接1和2,然后在2的左右分别取点,8和3,7和4,5和6
这样,以1为中心旋转就完全覆盖所有路径,
设N人参加比赛,那么我们需要旋转N-2次的多边形就可以完全覆盖
然后,我们需要进行算法的设计
如何存储配对信息呢?
我们可以设立一个数组queue[]
for(i=1;i<=m;i++){
a[i][1]=i;
queue[i]=i+1; ..........1
queue[m+i]=i+1; ............2
}
这样我们的1和2语句赋值后为queue={null,2,3,4,5,6,7,2,3,4,5,6,7}
其中,为了方便操作,不使用下标为0的数组元素queue[0],我们表示为null
而核心算法如下
for(i=1;i<=m;i++){
a[1][i+1]=queue[i];//某天与1对赛的选手,为1的对手编赛程
a[queue[i]][i+1]=1;//以1为中心,为1编赛程
for(int j = 1; j<=m/2;j++){//这里是配对选手的循环
int k=queue[i+j];
int r=queue[i+m-j];
a[k][i+1]=r;
a[r][i+1]=k;
}
}
其中 int k=queue[i+j];
int r=queue[i+m-j];
是实现如图三的覆盖配对取值,
因为queue={null,2,3,4,5,6,7,2,3,4,5,6,7}
queue[i+j] 与 queue[i+m-j] 就可以取到适当的值了
如下是9位选手参赛运行的结果(第一列为参赛选手编号)
实现方法二:分治法
这里假设n位选手被顺序编号为1,2,3,...,n,比赛的日程表是一个n行n-1列的表格,i行j列的表格内容是第i号选手在第j天的比赛对手。根据分而治之的原则,可从其中一半选手(2^(n-1位)的比赛日程,导出全体n位选手的日程,最终细分到只有两位选手的比赛日程出发。可假设只有8位选手参赛,若1至4号选手之间的比赛日程填在日程表的左上角 (4行3列),5至8号选手之间的比赛日程填在日程表的左下角(4行3列);那么左下角的 内容可由左上角的对应项加上数字4得到。至此,剩余的右上角(4行4列)是为编号小的 1至4号选手与编号大的5至8号选手之间的比赛日程安排。例如,在第4天,让1至4号选手分别与5至8号选手比赛,以后各天,依次由前一天的日程安排,让5至8号选手“循环轮转”。最后,比赛日程表的右下角的比赛日程表可由,右上角的对应项减去数字4得到.
如图:我们要计算8X8矩阵日程,可以通过求左上角4X4矩阵得到,若要求左上角4X4矩阵可以通过求左上角2X2矩阵得到,如此,我们采用分治法通过递归便可求得最终日程表
分治法具体实现请google一下吧,这里不提供源码了
- 大小: 12.7 KB
- 大小: 43.5 KB
- 大小: 27.2 KB
- 大小: 16.9 KB
- 大小: 81.6 KB
- 大小: 39.5 KB
- 大小: 38.7 KB
分享到:
相关推荐
在IT领域,多边形匹配是一项重要的几何计算任务,它涉及到图形学、图像处理和机器学习等多个方向。这里我们讨论的主题是"xml1.rar_多边形匹配",这是一个关于判断两个多边形是否相匹配的问题,其中数据存储在两个...
基于轮廓提取的多边形近似匹配算法 matlaB编的
分析了3种有代表性的平面多边形顶点匹配算法的特点,即基于极小化形变功的匹配算法、基于轮郭绕行趋势变化的匹配算法和基于边界局部剖分的匹配算法,综合利用不同算法的优点,在修正动态规划框架下设计了一种新的...
- 在计算机视觉中,多边形匹配和形状描述子用于识别和比较不同图像中的相似形状。 4. GIS(地理信息系统): - 地图上的地理特征,如城市、湖泊、国家边界等,常以多边形表示。GIS系统使用多边形数据进行空间分析...
4. 多边形匹配:适用于形状不规则的目标物体,通过定义多边形边界进行匹配。 5. 仿射匹配:更进一步,处理线性变换,如透视变换,适合物体倾斜或相机视角改变的情况。 6. 非线性变形匹配:对于更复杂的形状变化,如...
2. **顶点匹配**:确保相同的顶点只出现一次,消除重复。 3. **面的连接**:将共享边界的面正确地拼接起来,避免出现孔洞或重叠。 4. **拓扑保持**:确保合并后多边形的拓扑结构正确无误,不丢失任何细节。 5. **...
使用多边形匹配、KNN(K-Nearest Neighbors)算法或指纹地图匹配等方法,确定最接近的Landmark位置。 3. 动态跟踪:结合玩家的移动速度和方向,通过差分定位技术实时更新玩家的位置。若连续几次定位结果一致,可以...
标题中的“图像识别程序:多边形物体检测”是指一种技术,它...通过预处理图像、检测边缘、识别轮廓和形状匹配,程序能够有效地识别出图像中的多边形物体,这对于自动化监控、工业检测、自动驾驶等领域具有重要意义。
通常这类库会提供高级的算法,如形状检测、多边形匹配等,以供开发者在图像分析任务中使用。 在安装这个模块时,用户只需要拥有符合要求的Python环境(即Python 3.9版本且运行在64位Windows系统上),可以使用...
### 自动建立多边形拓扑关系算法步骤的优化与改进 #### 摘要与背景 自动建立多边形拓扑关系算法是地理信息系统(GIS)中的关键环节,尤其在处理多边形数据的转换过程中显得尤为重要。拓扑关系的建立能够确保地理...
而基于区域的插值,如多边形匹配、光流法等,能够更好地保留边缘信息,但计算复杂度较高。 在“一种深度图像缺失数据的插值方法”中,可能采用了结合这两种方法的策略。首先,利用邻近像素的信息进行初步插值,为...
为了处理非矩形VOP,MPEG-4采用了图像填充和多边形匹配技术,确保运动估计和补偿的准确性。 【运动向量】运动向量是描述图像帧间物体运动轨迹的数据,MPEG-4通过计算相邻帧间的运动向量来预测物体的移动,从而减少...
为解决上述问题,提出了一种基于多边形拟合的形状匹配和定位算法。该方法针对平面二维(2D)轮廓,通过对轮廓进行多边形拟合,获取轮廓上关键点,然后构建形状描述子用于形状匹配,再利用这些关键点坐标进行定位计算,...
3. 区域划分:将地图网格或像素与生成的多边形进行匹配,确定每个网格的归属。 4. 降雨量分配:计算每个多边形的面积,然后乘以对应的气象站降雨量,得到该区域的总降雨量。 5. 结果整合:汇总所有多边形的降雨量,...
- **计算机视觉**:图像分割、形状匹配等。 - **机器人路径规划**:避障、地图构建等。 综上所述,"多边形拓扑关系算法C++程序"是一个涵盖多边形几何关系判断的项目,通过C++实现,可以高效地处理各种拓扑关系,...
4. 交集和布尔操作部分介绍了边界框、交集检测和布尔运算,以及这些概念在多边形匹配问题中的应用。 5. 三角剖分部分说明了如何构造、访问和使用Delaunay三角剖分,以及如何使用自定义点类型。 6. 凸包部分则展示...
例如,在图像匹配中,它可以用来衡量两张图像中形状的相似程度。此外,在机器人路径规划中,Hausdorff距离也可以帮助评估不同路径之间的差异。 ### 示例分析 以图2为例,两个相同的三角形在相同最短距离的情况下...
高德web端实现多边形电子围栏demo 地图上点三个点形成多边形区域,可以通过拉拽添加点的形式添加边的数量 可判断marker是否在多边形区域区域内(jQuery需要自己添加)