循环赛日程表分治递归求解

分治法求解循环赛问题 一、问题分析 问题描述:有n个运动员进行单循环赛,即每个运动员要和所有其他运动员进行一次比赛。需要为n个运动员安排比赛日程。每个运动员每天只能进行一场比赛,且当运动员人数为偶数时,整个比赛在n-1天内结束,为奇数时,在n天内结束。运动员编号从1到n。 要求:设计算法对于任意N给出一个满足要求的循环赛安排表。 二、问题的解决方案/算法选择/设计思路 (一)问题解决方案: 设有n位选手参加循环赛,将n的取值分为三种情况:n=2^k,n为普通的偶数,n为奇数。 (1)每位选手要与其他n-1位选手比赛一 阅读详情

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

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

按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。
在这里插入图片描述如上图,所列出的正方形表是8个选手的比赛日程表。其中左上角与左下角的两小块分别为选手1至选手4和选手5至选手8前3天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了选手1至选手4和选手5至选手8在后4天的比赛日程。依此思想容易将这个比赛日程表推广到具有任意多个选手的情形。

问题求解

(1)用一个for循环输出日程表的第一行 for(int i=1;i<=N;i++) a[1][i] = 1
在这里插入图片描述

(2)然后定义一个m值,m初始化为1,m用来控制每一次填充表格时i(i表示行)和j(j表示列)的起始填充位置。

(3)用一个for循环将问题分成几部分,对于k=3,n=8,将问题分成3大部分,
第一部分为,根据已经填充的第一行,填写第二行,
第二部分为,根据已经填充好的第一部分,填写第三四行,
第三部分为,根据已经填充好的前四行,填写最后四行。
可以用for (ints=1;s<=k;s++) N/=2; 描述这个过程

(4)用一个for循环对③中提到的每一部分进行划分for(int t=1;t<=N;t++)对于第一部分,将其划分为四个小的单元,即对第二行进行如下划分
在这里插入图片描述同理,对第二部分(即三四行),划分为两部分,第三部分同理。

(5)最后,根据以上for循环对整体的划分和分治法的思想,进行每一个单元格的填充。填充原则是:对角线填充

     for(int i=m+1;i<=2*m;i++) //i控制行      
          for(int j=m+1;j<=2*m;j++)  //j控制列       
          { 
              a[i][j+(t-1)*m*2]= a[i-m][j+(t-1)*m*2-m];
/*右下角的值等于左上角的值 */ 
              a[i][j+(t-1)*m*2-m] =a[i-m][j+(t-1)*m*2];
/*左下角的值等于右上角的值 */
         }  

在这里插入图片描述在这里插入图片描述

算法实现

int a[101][101];
void cycle_table(int k)
{
    int n=1;//共有n个运动员
    for(int i=1;i<=k;i++) n=n*2;
    //先填写第一行
    for(int i=1;i<=n;i++) a[1][i]=i;
    int m=1;
    for(int s=1;s<=k;s++)
    {
        n=n/2;//每次循环的次数
        for(int t=1;t<=n;t++)
        for(int i=m+1;i<=2*m;i++)
        for(int j=m+1;j<=2*m;j++)
        {
            a[i][j+(t-1)*2*m]=a[i-m][j+(t-1)*2*m-m];
            a[i][j+(t-1)*2*m-m]=a[i-m][j+(t-1)*2*m];
        }
        m=m*2;
    }

}

输入输出

输入

输入只有一行,输入一个数为k,运动员人数N=2k

输出

输出有N行N列,每个数字中间有一个空格
第一列表示每个运动员的序号,第2-N列表示N-1天的赛事安排

样例输入

3

样例输出

1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int a[101][101];
void cycle_table(int k)
{
    int n=1;//共有n个运动员
    for(int i=1;i<=k;i++) n=n*2;
    //先填写第一行
    for(int i=1;i<=n;i++) a[1][i]=i;
    int m=1;
    for(int s=1;s<=k;s++)
    {
        n=n/2;//每次循环的次数
        for(int t=1;t<=n;t++)
        for(int i=m+1;i<=2*m;i++)
        for(int j=m+1;j<=2*m;j++)
        {
            a[i][j+(t-1)*2*m]=a[i-m][j+(t-1)*2*m-m];
            a[i][j+(t-1)*2*m-m]=a[i-m][j+(t-1)*2*m];
        }
        m=m*2;
    }

}
int main()
{
    int k;
    cin>>k;
    int n=1;
    for(int i=1;i<=k;i++) n=n*2;
    cycle_table(k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

在这里插入图片描述

循环赛日程表(分治递归法) 循环赛日程表是非常典型的分治递归的例子,也的一个稍微有点难的问题。但是,我相信大家一定没问题 立即下载

相关推荐

C语言实现循环赛日程安排问题

循环赛日程安排问题是算法分析与设计中的经典问题,本程序采用C语言实现的,很好啊!!! 问题描述: 设有n(n = 2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。试按此要求为比赛安排日程。

应用分治与递归的算法求循环赛问题。

在表中第i行和第j列处填入第i个选手在第j天所遇到的选手。:按分治策略,我们可以将所有选手对分为两组,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。现在是对于两个运动员的可以这样做,那么我们可以采用分治的思想,将8个运动员分成4个运动员,再将4个运动员分成2个运动员就可以这样做,那么我们就需要使用递归的思想,上述讨论的是num = 1的情况,那么递归的时候就要将num一直改变。可以看出左上角与右下角的数字是对应的,左下角与右上角的数字也是对应的,但是我们可以再细分。

haoprivate的博客 869

立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输至原子云

本文详细介绍了如何使用立创·庐山派-K230-CanMV开发板,通过ATK-ESP8266 WIFI模块实现图像识别数据的无线传输至原子云平台。内容包括硬件连接、软件环境搭建、AT指令控制、原子云连接及数据上传的全过程,并提供了实用的调试技巧和常见问题解决方案,为物联网应用开发提供了完整实践指南。

potato的博客 742

循环赛赛程表的分治法实现

设有n=2k(k=1,2,…)个运动员要进行循环赛,现在设计一个满足要求的比赛日程表;有如下要求:1每个选手要与其他n-1个选手进行一次比赛;2每个选手明天只能比赛一次;3循环赛为期n-1天;首先我们先来看当k=1时的比赛情况这时有两名选手;选手对战者1221此时需要进行1场比赛,当k=2,有四个运动员时选手对战者1234214334124321此时观察表格,表格意义:的是在第i行,第j列,表示第i位选手,第j天遇到的选手;

qq_73174843的博客 1637

matlab液体湿润模拟,【水文模型】01 三水源新安江模型

目录一、概述1.1 流域概况1.2 产流方式论证1.3 设计基本任务1.4 设计原始资料二、新安江模型2.1 流域划分2.2 产汇流计算2.2.1 蒸散发计算2.2.2 产流计算2.2.3 水源划分2.2.4 汇流计算2.3 模型参数2.3.1 参数物理意义2.3.2 参数率定结果2.4 模拟结果2.4.1 精度统计表2.4.2 计算与实测流量过程线比较三、精度统计与误差分析3.1 精度统计3.2...

weixin_34173656的博客 5327

RTX4090上跑CenterNet训练

参考实现 url=https://github.com/xingyizhou/CenterNet.git commit_id=5b1a490a52da57d3580e80b8bb4bbead9ef2af96

遗失的神庙 1622

循环赛问题(递归,分治)

N阶方阵A[1..n,0..n−1],当j>0时,A[i,j]表示第i名运动员在第j天所遇到的比赛对手(A[i,0]=i),每个数据占5位宽度。设有n个选手的网球循环比赛,其中n=2^k(0≤k<7)。历时三天,终于解决。放弃循环,苦想递归!(难道循环难吗,不难,只是阻挡我装伯夷的步伐。(3)整个比赛共进行n−1天,要求每天没有选手轮空。(1)每名选手要与其他n−1名选手都进行一次比赛;选手人数n(n≤100),n只能为2的整数次幂。(2)每名选手每天只赛一次;

qq_74910785的博客 473

防止加入域主机脱离域的控制(管理员权限)

一、简介   当公司所有主机加入到域后,SA首要工作就是防止加入域的主机脱离域的控制。让我发现该工作的必要性是一程序猿,前一天刚配完禁止执行QQ、微信执行,第二天就看到那家伙在用微信聊天,肯定是用回旧的本地账号登陆了。   本人所在公司安装软件的类型繁杂,无管理员权限运行不少软件会报错,不得不授予「域账号」本地管理员权限。过大的权限带也来了一系列后果:用户可随意退出域、创建本地管理员...

der69615的博客 3174

算法设计与分析——递归与分治策略——循环日程赛

问题描述: 非递归方案一:代码 #include<bits/stdc++.h> using namespace std; void gameTable(vector<vector<int>> &vec,int k) { int i=0,j=0;//二维数组的下标,行,列 int temp;//需要新安排选手数目 int n;//当前的选手数目 //先初始化一个两人的比赛表 n=2; //k=1两个参赛选手日程可以直接求得 vec[1]

qq_50675813的博客 368

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1468

机器人全局路线规划导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对全局路线规划导读做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1504

用递归与分治策略求解网球循环赛日程表_算法——循环赛日程安排问题

一、问题背景设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表:①每个选手必须与其他n-1个选手各赛一次;②每个选手一天只能赛一次。二、问题分析按此要求,可将比赛日程表设计成一个n×(n-1)的二维表,其中,(i, j)表示和第i个选手在第j天比赛的选手。•将所有参赛的选手分为两部分n=2^k个选手的比赛日程表就可以通过为n/2=2^(k-1)个选手设计的比赛日程表来决定。•...

weixin_39523529的博客 2287

windows server 2012 AD 活动目录部署系列(十一)安装证书服务器(ADCS)

本篇博文介绍如何在AD域控上安装证书服务器,本实验域环境:yun.com。 步骤如下: 1、打开“服务器管理器”,点击“添加角色和功能”,如下图: 2、点击下一步, 3、点击下一步, 4、点击下一步, 5、点击“Active Directory证书服务”,弹出功能选择,点击"添加功能",如下图,

白昼的技术专栏 2万+

用递归与分治策略求解网球循环赛日程表_浅谈什么是分治算法

1 概念 分治算法,根据字面意思解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。2 算法策略 分治策略:对于一个规模为 n 的问题,若该问题可以容易地解决(比如说规模 n 较小)则直接解决,否则将其分解为 k 个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这...

weixin_39671621的博客 144

安装glibc出现../sysdeps/nptl/pthread.h:744:47:error:argument 1 of type ‘struct __jmp_buf_tag *‘ 解决方案

本文主要介绍了安装glibc出现…/sysdeps/nptl/pthread.h:744:47:error:argument 1 of type ‘struct __jmp_buf_tag *’ 解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

用递归与分治策略求解网球循环赛日程表_分治算法,了解一下?

1 概念 分治算法,根据字面意思解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。2 算法策略 分治策略:对于一个规模为 n 的问题,若该问题可以容易地解决(比如说规模 n 较小)则直接解决,否则将其分解为 k 个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这...

weixin_40008969的博客 383

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

用递归与分治策略求解网球循环赛日程表_你真的了解分治策略吗?

话不多说,上货!在分治策略中,我们递归的求解一个问题,在每层递归中应用如下三个步骤:分解:将一个问题划分为若干个子问题,子问题的形式与原问题一样,不过规模更小。解决:递归的求解出子问题。若子问题的规模非常小则停止递归,直接求解。合并:将子问题的解合并成原问题的解。 当子问题足够大时,我们需要递归求解,称之为递归情况(recursive case)。当子问题分解的足够小,不需要再递归时,...

weixin_39604276的博客 179

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

用递归与分治策略求解网球循环赛日程表_减治策略和分治策略

在算法设计与分析里,有这么两个算法,减治策略和分治策略。减治我还是第一次听说,分治之前听说过,但说实话,减治和分治什么区别,有时候还真说不上来。今天趁着这个机会,再复习一下这两个算法分析策略。减治策略减治(decrease-and-conquer)技术利用了一个问题给定实例的解和同样问题较小实例的解之间的某种关系。一旦建立了这种关系,我们既可以从顶向下,也可以从底向上的来运用该关系。—- 节选自《...

weixin_39698255的博客 196

用递归与分治策略求解网球循环赛日程表_分治、动态规划、回溯、贪心一锅炖

「观感度:五颗星」「口味:东北一锅出」「烹饪时间:10min」本文已收录在Github github.com/Geekhyt,感谢Star。数据结构与算法系列专栏第四弹来袭,往期专栏链接如下:前端如何搞定数据结构与算法JavaScript算法时间、空间复杂度分析你真的懂递归吗?初学者一听到算法思想,就会觉得它们高深莫测,只能望而却步。但如果你看过《事实》这本书,你就不会被大脑中的惯性思维所影响。 ...

weixin_39756192的博客 570

用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

一、算法思路1、思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归的解决这些子问题,然后将各子问题的解合并得到原问题的解2、分治法适用范围一般具有以下特征的问题可以使用分治算法求解:(1)求解问题可以分解为若干个规模较小的相同问题(2)求解问题的规模分解到一定程度,就...

weixin_39908985的博客 914

用递归与分治策略求解网球循环赛日程表_递归解法:让程序员的代码更优雅

一切都应该尽可能地简单,但不要太简单 ——阿尔伯特·爱因斯坦将复杂的问题简单化,抓到本质,能够让我们的编程更愉快。分治策略、动态规划都是如此,将复杂的问题分解成规模小的简单问题。本文介绍的递归,是很多算法都使用的一种方法,让复杂问题简单化,同时能让你的代码更加优雅。调用栈讲递归之前,不得不提到调用栈(Call Stack),因为调用栈:使得递归成为可能同时有助于理解递归的执行细节。自定义函数,使...

weixin_39942397的博客 283

用递归与分治策略求解网球循环赛日程表_javascript使用分治算法解决汉罗塔问题...

分治算法介绍1.分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……2.分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速排序线性时间...

weixin_39855634的博客 113

用递归与分治策略求解网球循环赛日程表_JS数据结构与算法之《分治、回溯、动态规划与贪心》...

概念分治算法不是简单的递归,而是将大的问题递归解决较小的问题,然后从子问题的解构建原问题的解。比如,快速排序和归并排序算分治算法,及 MapReduce 也是利用了分治思想,而图的递归深度搜索和二叉树的递归遍历则不是分治算法的运用。回溯算法相当于穷举搜索的巧妙实现,对比蛮力的穷举搜索,回溯算法可以对一些不符合要求的或者是重复的情况进行裁剪,不再对其进行搜索,以减少搜索的工作量提高效率。比如,在图运...

weixin_39841825的博客 400

用递归与分治策略求解网球循环赛日程表_五大常见算法策略之——动态规划策略(Dynamic Programming)

Dynamic ProgrammingDynamic Programming是五大常用算法策略之一,简称DP,译作中文是“动态规划”,可就是这个听起来高大上的翻译坑苦了无数人,因为看完这个算法你可能会觉得和动态规划根本没太大关系,它对“动态”和“规划”都没有太深的体现。举个最简单的例子去先浅显的理解它,有个大概的雏形,找一个数组中的最大元素,如果只有一个元素,那就是它,再往数组里面加元素,递推关系...

weixin_39834328的博客 333

分治与递归

1.循环赛日程表安排问题 #include<stdio.h> #include <stdlib.h> #include <cmath> #include <iostream> using namespace std; void GameTable(int k, int a[50][50]) { int n=2; ...

weixin_34357962的博客 135

分治法解决棋盘覆盖、循环赛日程表、快速排序、归并排序

标题说到分治,就不得不先提递归了 递归算法:直接或者间接调用自身的算法称为递归算法。 设计步骤: 分析问题、寻找递归关系; 设置边界、控制递归; 设计函数、确定参数。 接下来看一个递归的例子:递归解决全排列问题 引用问题描述:设R={r1,r2,…,rn}是要进行排列的n个元素,求R的全排列Perm(R)。 问题分析: 设(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。 解决方案: 1.递归关系:perm(R)由(r1)perm(R1),(r2)perm(R2)

HangHug_L的博客 836
上一篇: 合并排序分治递归求解
下一篇: 0-1背包问题动态规划求解
practical_sharp
博客等级 码龄8年 499粉丝 148原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值