`
acheron
  • 浏览: 66372 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

多边形匹配

阅读更多

因为时下的java程序员被骂素质差,

所以今日要发一个算法日志,证明我是懂算法的,汗......

 

这是我数据结构课程设计算法之一

(GDPU)课程设计问题描述:
说明:设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)循环赛一共进行n-1天。
设计要求:请使用C语言编程,设计一个有效的算法解决循环赛日程表问题。

 

网上能找到的答案是使用分治法,

我这里自己写的多边形匹配算法,其他地方没有现成代码能找到的

同时提供思想,和算法实现

 

实现方法一:多边形算法思想

首先我们在循环赛中,要实现选手两两配对,因为每天选手只能参加一场比赛,

所以我们要设计一个配对方式既能够适宜计算机存储和运算,又能够高效解决问题的算法。




 
 

这里先给出算法策略:两两点匹配,并且匹配的每组点,相邻点的间隔不能相同

(如下图2

编号1与编号2相邻,

编号3与编号5一个点,

编号4与编号7相邻2个点

这时,我们以多边形中心为轴,旋转8个点组成的多边形,

其中红线为配对线,不需要变化,

每转360,代表一天的赛事,以各红线两端编号两两配对,

然而,这样的图设计不能完全覆盖所有的配对旋转时覆盖的路径,

因为剩下86,如果我们给它配对,但他们相邻也是1个点,跟35重复了

 




 
 

这时候,我们重新设计路径覆盖的配对,(如图3

我们只要把其中的编号1移到中心轴,外圈是奇数点,

这样,先连接12,然后在2的左右分别取点,837456

这样,以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,比赛的日程表是一个nn-1列的表格,ij列的表格内容是第i号选手在第j天的比赛对手。根据分而治之的原则,可从其中一半选手(2^(n-1)的比赛日程,导出全体n位选手的日程,最终细分到只有两位选手的比赛日程出发。可假设只有8位选手参赛,若14号选手之间的比赛日程填在日程表的左上角        (43)58号选手之间的比赛日程填在日程表的左下角(43);那么左下角的        内容可由左上角的对应项加上数字4得到。至此,剩余的右上角(44)是为编号小的        14号选手与编号大的58号选手之间的比赛日程安排。例如,在第4天,让14号选手分别与58号选手比赛,以后各天,依次由前一天的日程安排,让58号选手“循环轮转”。最后,比赛日程表的右下角的比赛日程表可由,右上角的对应项减去数字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
分享到:
评论

相关推荐

    xml1.rar_多边形匹配

    在IT领域,多边形匹配是一项重要的几何计算任务,它涉及到图形学、图像处理和机器学习等多个方向。这里我们讨论的主题是"xml1.rar_多边形匹配",这是一个关于判断两个多边形是否相匹配的问题,其中数据存储在两个...

    基于轮廓提取的多边形近似匹配算法 matlaB

    基于轮廓提取的多边形近似匹配算法 matlaB编的

    多边形顶点匹配优化算法 (2007年)

    分析了3种有代表性的平面多边形顶点匹配算法的特点,即基于极小化形变功的匹配算法、基于轮郭绕行趋势变化的匹配算法和基于边界局部剖分的匹配算法,综合利用不同算法的优点,在修正动态规划框架下设计了一种新的...

    数据集,包含多边形的示例.rar

    - 在计算机视觉中,多边形匹配和形状描述子用于识别和比较不同图像中的相似形状。 4. GIS(地理信息系统): - 地图上的地理特征,如城市、湖泊、国家边界等,常以多边形表示。GIS系统使用多边形数据进行空间分析...

    halcon_各种定位方法

    4. 多边形匹配:适用于形状不规则的目标物体,通过定义多边形边界进行匹配。 5. 仿射匹配:更进一步,处理线性变换,如透视变换,适合物体倾斜或相机视角改变的情况。 6. 非线性变形匹配:对于更复杂的形状变化,如...

    多边形合并c# c++

    2. **顶点匹配**:确保相同的顶点只出现一次,消除重复。 3. **面的连接**:将共享边界的面正确地拼接起来,避免出现孔洞或重叠。 4. **拓扑保持**:确保合并后多边形的拓扑结构正确无误,不丢失任何细节。 5. **...

    网络游戏-基于Lankmark的WIFI网络内移动标签定位跟踪方法.zip

    使用多边形匹配、KNN(K-Nearest Neighbors)算法或指纹地图匹配等方法,确定最接近的Landmark位置。 3. 动态跟踪:结合玩家的移动速度和方向,通过差分定位技术实时更新玩家的位置。若连续几次定位结果一致,可以...

    图像识别程序:多边形物体检测

    标题中的“图像识别程序:多边形物体检测”是指一种技术,它...通过预处理图像、检测边缘、识别轮廓和形状匹配,程序能够有效地识别出图像中的多边形物体,这对于自动化监控、工业检测、自动驾驶等领域具有重要意义。

    lanms_neo-1.0.2-cp39-cp39-win_amd64.whl.zip

    通常这类库会提供高级的算法,如形状检测、多边形匹配等,以供开发者在图像分析任务中使用。 在安装这个模块时,用户只需要拥有符合要求的Python环境(即Python 3.9版本且运行在64位Windows系统上),可以使用...

    自动建立多边形拓扑关系算法步骤的优化与改进

    ### 自动建立多边形拓扑关系算法步骤的优化与改进 #### 摘要与背景 自动建立多边形拓扑关系算法是地理信息系统(GIS)中的关键环节,尤其在处理多边形数据的转换过程中显得尤为重要。拓扑关系的建立能够确保地理...

    行业分类-设备装置-一种深度图像缺失数据的插值方法.zip

    而基于区域的插值,如多边形匹配、光流法等,能够更好地保留边缘信息,但计算复杂度较高。 在“一种深度图像缺失数据的插值方法”中,可能采用了结合这两种方法的策略。首先,利用邻近像素的信息进行初步插值,为...

    一种基于Linux的MPEG-4算法实现.pdf

    为了处理非矩形VOP,MPEG-4采用了图像填充和多边形匹配技术,确保运动估计和补偿的准确性。 【运动向量】运动向量是描述图像帧间物体运动轨迹的数据,MPEG-4通过计算相邻帧间的运动向量来预测物体的移动,从而减少...

    基于多边形拟合的形状匹配与定位算法研究

    为解决上述问题,提出了一种基于多边形拟合的形状匹配和定位算法。该方法针对平面二维(2D)轮廓,通过对轮廓进行多边形拟合,获取轮廓上关键点,然后构建形状描述子用于形状匹配,再利用这些关键点坐标进行定位计算,...

    降水分块计算面积(泰森多边形法).rar

    3. 区域划分:将地图网格或像素与生成的多边形进行匹配,确定每个网格的归属。 4. 降雨量分配:计算每个多边形的面积,然后乘以对应的气象站降雨量,得到该区域的总降雨量。 5. 结果整合:汇总所有多边形的降雨量,...

    多边形拓扑关系算法C++程序

    - **计算机视觉**:图像分割、形状匹配等。 - **机器人路径规划**:避障、地图构建等。 综上所述,"多边形拓扑关系算法C++程序"是一个涵盖多边形几何关系判断的项目,通过C++实现,可以高效地处理各种拓扑关系,...

    CGAL英文手册

    4. 交集和布尔操作部分介绍了边界框、交集检测和布尔运算,以及这些概念在多边形匹配问题中的应用。 5. 三角剖分部分说明了如何构造、访问和使用Delaunay三角剖分,以及如何使用自定义点类型。 6. 凸包部分则展示...

    凸多边形之间的Hausdorff距离

    例如,在图像匹配中,它可以用来衡量两张图像中形状的相似程度。此外,在机器人路径规划中,Hausdorff距离也可以帮助评估不同路径之间的差异。 ### 示例分析 以图2为例,两个相同的三角形在相同最短距离的情况下...

    高德地图web多边形电子围栏demo

    高德web端实现多边形电子围栏demo 地图上点三个点形成多边形区域,可以通过拉拽添加点的形式添加边的数量 可判断marker是否在多边形区域区域内(jQuery需要自己添加)

Global site tag (gtag.js) - Google Analytics