循环赛日程表分治算法

循环赛日程表分治算法
循环赛日程表分治算法

/*

* 设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:

* 每个选手必须与其他n-1个选手各赛一次;

* 每个选手一天只能参赛一次;

* 循环赛在n-1天内结束。

* 数组a[i][j]第i个选手在第j天所遇到的选手。 */

#include<>

#include<>

void gametable(int k)

{

int a[100][100];

int n,temp,i,j,p,t;

n=2;..2^k个选手的比赛日程

{

temp=n;n=n*2;//填左下角元素

for(i=temp+1;i<=n;i++)

for(j=1;j<=temp;j++)

a[i][j]=a[i-temp][j]+temp;//左下角和左上角元素的对应关系

for(i=1;i<=temp;i++)//将左下角元素抄到右上角

for(j=temp+1;j<=n;j++)

a[i][j]=a[i+temp][(j+temp)%n];

for(i=temp+1;i<=n;i++)//将左上角元素抄到右下角

for(j=temp+1;j<=n;j++)

a[i][j]=a[i-temp][j-temp];

}

printf("参赛人数为:%d\n(第i行第j列表示和第i个选手在第j天比赛的选手序号)\n",n);

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

{

printf("%d ",a[i][j]);

if(j==n)

printf("\n");

}

}

void main()

{

int k;

printf("比赛选手个数为n(n=2^k),请输入参数K(K>0):\n"); scanf("%d",&k);

if(k!=0)

gametable(k);

}

循环赛的方法与编排

循环赛的方法与编排 一、循环赛的种类与特点 (一)循环赛的种类 循环赛又称循环法。是指参赛队(或个人,下同)之间,都要互相轮流比赛,最后按照各参赛队在全部比赛中的胜负场数、得分多少排定名次的比赛方法。它在对抗性项目比赛中经常被采用。循环赛包括单循环、双循环或分组循环三种。单循环是所有参赛队(人)相互轮赛一次;双循环是所有参赛队(人)相互轮赛二次;分组循环是参赛队(人)较多时,采用种子法,把强队(人)分散在各组,先进行小组单循环赛,再根据小组名次来组织第二阶段的比赛。主办单位可根据参赛队多少和比赛期限的长短以及项目特点而灵活选用。一般情况下,单循环宜在参赛队不太多,比赛时间与场地又比较充裕时采用;分组循环大多是在参赛队数多,比赛时间又不能过长,并尽量为参赛队提供比赛机会,使比赛能较合理地排定名次时采用。 (二)循环赛的特点 采用循环法进行比赛,总的优点是参赛队机会均等,实战和互相观摩学习的机会多,能准确地反映出参赛队之间真正的技术水平的高低,客观地排定参赛队的名次,比赛结果的偶然性和机遇性小。上述优点正是淘汰赛的主要缺点,但循环赛自身也存在有某些不足与矛盾,应引起组织者的重视。 1.比赛总的期限长,占用场地和时间多,当参赛队(人)多时,直接采用大循环赛有一定困难,应用范围上有一定的局限性。 2.如何合理地安排比赛的顺序,避免在比赛时间、间隙、地点、场次和比赛条件等方面出现的不均衡现象。 3.当比赛结果有两个或两个以上队的胜负场数相同,得失分相等时,如何根据不同项目的特点,科学地解决好最后名次的排定。 二、循环赛的轮数与场数计算 (一)循环赛的轮数 每个参赛队赛毕一场(轮空队除外),称为一轮结束。计算循环赛的轮数,目的在于计划整个比赛所需用的时间或期限,是比赛日程安排的主要依据。其计算方法:Y=轮次数,N=参赛队数 如果参赛队为偶数Y=N-1 即轮次数=参赛队数-1 如果参赛队为奇数,则:比赛轮数=参赛队数。 注:双循环赛的轮数是单循环赛轮数的加倍。 (二)循环赛的场数 循环赛的场数是指参赛队之间互相轮流比赛全部结束的总场数。计算循环赛的比赛总场数,目的在于计划安排人力、物力、比赛日程与场地。其计算方法如下: X=N×(N-1)÷2 X为比赛场数,N为参赛队数。 单循环比赛场数=参赛队数×(参赛队数-1)÷2 双循环比赛的总场数=参赛队数×(参赛队数-1) 三、循环比赛顺序的编排方法与注意事项 (一)单循环比赛顺序的编排方法 1.轮次表的安排方法

(完整word版)分治法循环赛日程表实验报告

西北农林科技大学信息工程学院《算法分析与设计》综合训练实习报告 题目:分治法循环赛日程表 学号 姓名 专业班级 指导教师 实践日期2011年5月16日-5月20日

目录 一、综合训练目的与要求 (1) 二、综合训练任务描述 (1) 三、算法设计 (1) 四、详细设计及说明 (3) 五、调试与测试 (4) 六、实习日志 (6) 七、实习总结 (6) 八、附录:核心代码清单 (6)

一、综合训练目的与要求 本综合训练是软件工程专业重要的实践性环节之一,是在学生学习完《算法分析》课程后进行的综合练习。本课综合训练的目的和任务: (1)巩固和加深学生对算法分析课程基本知识的理解和掌握; (2)培养利用算法知识解决实际问题的能力; (3)掌握利用程序设计语言进行算法程序的开发、调试、测试的能力; (4)掌握书写算法设计说明文档的能力; (5)提高综合运用算法、程序设计语言、数据结构知识的能力。 二、综合训练任务描述 假设有n=2k 个运动员要进行网球循环赛。设计一个满足一下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次 (2)每个选手一天只能赛一次 (3)循环赛一共进行n-1天 利用Java语言开发一个界面,输入运动员的个数,输出比赛日程表。对于输入运动员数目不满足n=2k时,弹出信息提示用户。 三、算法设计 (1) 文字描述 假设n位选手顺序编号为1,2,3……n,比赛的日程表是一个n行n-1列的表格。第i行j列表示第i号选手在第j天的比赛对手,根据分治法,要求n个选手的比赛日程,只要知道其中一半的比赛日程,所以使用递归最终可以分到计算两位选手的比赛日程,然后逐级合并,得出结果。 (2) 框图

第一节 循环赛的方法与编排

第一节循环赛的方法与编排 一、循环赛的种类与特点 (一)循环赛的种类 1、概念循环赛又称循环法。指参赛队(人)之间,都相互轮流比赛,最后按照各参赛队在全部比赛中的胜负场数、得分多少排定名次的比赛方法。 2、分类循环赛包括单循环、双循环和分组循环三种。 单循环是所有参赛队(人)相互轮赛一次;一般在参赛队人不太多,场地和时间比较充裕时采用。 双循环是所有参赛队(人)相互轮赛二次;一般在参赛队人不多,场地和时间比较充裕时采用。 分组循环是参赛队(人)较多时,采用种子法,把强队(人)分散在各组,先进行小组循环,再根据小组名次组织第二阶段的比赛。一般在参赛队人多,场地和时间较紧时采用。 (二)循环赛的优缺点 优点:参赛队机会均等,实战和相互观摩学习的机会多,能准确反映出参赛队之间真正的技术水平的高低,客观地排定参赛队的名次,比赛结果的偶然性和机遇小。 缺点: 1、比赛总的期限长,站用场地和时间多,当参赛队人多时,直接采用大循环有一定的困难,应用范围具有一定的局限性。 2、如何合理安排比赛的顺序,避免在比赛时间、间隙、地点、场次和比赛条件等方面出现不均衡现象。 3、当比赛结果有两个或两个以上队人的胜负场数相同,得失分相等时,如何根据不同项目的特点,科学地解决好最后的名次排定。 二、循环赛的轮数与场数计算 (一)循环赛的轮数 每个参赛队赛完一场(轮空队除外),称为一轮结束。计算循环赛的轮数的目的在于计划整个比赛所需要的时间和期限,是比赛日程安排的主要依据。 计算方法: 1、单循环 当N=2n时,Y=N-1 当N=2n-1时,Y=N (其中Y=轮次数,N=参赛对数) 2、双循环和多循环为单循环的倍数。 (二)循环赛的场数 循环赛的场数是指参赛队人之间相互轮流比赛全部结束

网球循环赛日程表

一、问题表述: 设有n个运动员要进行网球循环赛。设计一个满足以下要 求的比赛日程表, (1)每个选手必须与其他n-1个选手各赛一次; (2) 每个选手一天只能赛一次; (3) 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环 赛进行n天 二、分析问题 题目是要n名运动员进行循环比赛。当n为偶数时,正好每天都可以两两一组,与其余的n-1个选手比赛,只需n-1天; 而当n为奇数,每天将有一个选手轮空,比赛将持续n天。 可以采用的算法如下: 1.算法一:使用分治法 当n为偶数时,可以讲问题分为两个部分n/2; 然后继续划分, 知道最后剩余两名选手单独比赛。当n为奇数时,增设一个虚拟 选手,运动员为n+1个,将问题转化为是偶数的情形。当选手与 虚拟选手比赛时,表示轮空,因此只需要关注n为偶数的情形。 a)当n/2为偶数时,与n = 2^k情形类此。 b)当n/2为奇数时,增设一个虚拟的选手,递归返回的将有轮 空的选手,可以讲在前面n/2轮比赛的选手与后面n/2轮空的 选手进行比赛。 2.算法二:利用边是奇数的正多边形。 特点:以多边形中的任意一个顶点画对称轴,其余偶数对顶点相 互对称。 N名选手编号为1~n,将其画成一个正多边形。 a)所以当n为奇数时,第一天1号休息,其余以一号为对称轴, 两两对称打比赛,第二天开始一次轮流休息,其余一休息的 那个人编号为对称轴,两两比赛。这样比赛可进行n天。如 图:

b) 当n 为偶数时,取出编号最大的,其他的组成一个正多边形,n 号一次顺序与1,2,。。。n-1号选手比赛,其他与a )相同。如图所示:(图中是从0开始编号)

分治与递归 循环赛编程

实验一:分治与递归 【实验目的】 深入理解分治法算法思想,并采用分治法进行程序设计。 【实验性质】 验证性实验。 【实验内容与要求】 设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:⑴每个选手必须与其他n-1个选手各赛一次;⑵每个选手一天只能赛一次;⑶循环赛一共进行n-1天。按此要求可将比赛日程表设计-成有n行和n-l列的一个表。在表中第i行和第j列处填入第i个选手在第j天所遇到的选手。用分治法编写为该循环赛设计一张比赛日程表的算法并运行实现、对复杂度进行分析。 算法思想:按分治策略,我们可以将所有选手对分为两组,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用这种一分为二的策略对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。 下图所列出的正方形表是4个选手的比赛日程表。其中左上角与左下角的两小块分别为选手1至选手2和选手3至选手4第1天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了选手1至选手2和选手3至选手4在后2天的比赛日程。这种安排是符合要求的。 程安排表。

#include #include #define x 16 int a[x][x]; void gamecal(int k,int m); void main() { int i,j,m; // int a[x][x]={0}; printf("请输入参赛人数(2^x):"); scanf_s("%d",&m); gamecal(1,m); printf("d:"); for(i=1;i

循环赛日程表问题研究

学年论文 题目循环赛日程表问题研究 学生 指导教师 年级2009级 专业软件工程 系别软件工程 学院计算机科学与信息工程学院 哈尔滨师范大学 2012年6月 论文提要 本文采用分治算法来解决循环赛日程表的安排问题。通过对问题的详细分析,列出1到10个选手的比赛日程表,找出两条规则,作为算法实现的依据,而后采用c语言实现算

法,通过测试分析,程序运行结果正确,运行效率较高。同时也介绍了循环赛日程表问题的另一种解法多边形解法,这种方法另辟蹊径,巧妙地解决了循环赛日程表问题,运行效率较高。 循环赛日程表问题研究 摘要:本文采用分治算法来解决循环赛日程表的安排问题。根据算法的设计结果,采

用c 语言实现算法,通过测试分析,程序运行结果正确,运行效率较高。同时也介绍了循环赛日程表问题的另一种解法,这种方法另辟蹊径,想法独特,运行效率较高。 关键词:循环赛日程表问题;分治法 一、题目描述 设有n 个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)当n 是偶数时,循环赛进行n-1天。当n 是奇数时,循环赛进行n 天。 二、问题分析 循环赛日程表可以采用分治法实现,把一个表格分成4个小表格来处理,每个小表格都是一样的处理方法,只是参数不同。分析过程具体如下: 1、n=1 (表2-1) 2.、n=2 (表2-2) 3、n=3 (1) 添加一个虚拟选手4#,构成n+1=4 (2) 4/2=2,分两组,每组各自安排(1 2),(3 4) (3) 每组跟另一组分别比赛(拷贝)这是四个人比赛的 (表2-3) 4人赛程 (4) 把虚选手置为0 (表2-4)3人赛程 1 1 2 2 1 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1

用C++编写循环赛日程表

循环赛日程表 问题描述:设有n位选手参加网球循环赛,n=2^k,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天比赛一场,不能轮空,按一下要求为比赛安排日程, (1)每位选手必须与其他n-1格选手格赛一场; (2)每个选手每天只能赛一场; (3)循环赛一共进行n-1天; #include int a[50][50]; void table (int x,int k) //此函数为从x号球员起的共2的k次方名球员的安排日程表 { int i,j,y=1; if(k==1)//只有两名球员 { a[x][0]=x; a[x][1]=x+1; a[x+1][0]=x+1; a[x+1][1]=x; } else { for(i=1;i<=k-1;i++) {y=y*2;} table(x,k-1); table(x+y,k-1); for(i=x;i

int n=1; cout<<"请输入k值"<>k; for(i=1;i<=k;i++) {n=n*2;} cout<<"参赛人数"<<" "<

分支算法循环赛日程表课程设计

摘要 分治算法在实际中有广泛的应用,例如,对于n个元素的排序问题,当n = 1 时,不需任何计算;当n = 2 时,只要做一次比较即可排好序;当n = 3时只要做两次比较即可……而当n较大时,问题就不容易那么处理了。要想直接解决一个较大的问题,有时是相当困难的。分治算法的基本思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。如果原问题可分割成k个子问题,1 < k < n+1,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治算法就是可行的。由分治算法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易求出其解。由此自然引出递归算法。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 本次课程设计正是采用分治算法来解决循环赛日程表的安排问题。根据算法的设计结果,采用c语言实现算法,通过测试分析,程序运行结果正确,运行效率较高。 关键词:分治算法

目录 摘要 ..................................................................................................................... I 1 问题描述 (1) 2 问题分析 (2) 3 算法设计 (3) 4 算法实现 (7) 5 测试分析 (11) 结论 (12) 参考文献 (13)

1 问题描述 设有n位选手参加网球循环赛,n=2k,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天比赛一场,不能轮空,按以下要求为比赛安排日程, 1)每位选手必须与其他n-1格选手格赛一场; 2)每个选手每天只能赛一场; 3)循环赛一共进行n-1天; 请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行和第j列处填入第i个选手在第j天所遇到的选手,其中1≤i≤n,1≤j≤n-1。

算法分析实验报告--分治策略

分治策略 姓名:XXX 专业班级:XXX 学号:XXX 指导教师:XXX 完成日期:XXX

一、试验名称:分治策略 (1)写出源程序,并编译运行 (2)详细记录程序调试及运行结果 二、实验目的 (1)了解分治策略算法思想 (2)掌握快速排序、归并排序算法 (3)了解其他分治问题典型算法 三、实验内容 (1)编写一个简单的程序,实现归并排序。 (2)编写一段程序,实现快速排序。 (3)编写程序实现循环赛日程表。设有n=2k个运动员要进行网球循环赛。现 要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其它n-1个选手各赛一次(2)每个选手一天只能赛一场(3)循环赛进行n-1天 四、算法思想分析 (1)编写一个简单的程序,实现归并排序。 将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行 排序,最终将排好序的子集合合并成为所要求的排好序的集合。 (2)编写一段程序,实现快速排序。 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有 数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数 据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据 变成有序序列。 (3)编写程序实现循环日赛表。 按分治策略,将所有的选手分为两组,n个选手的比赛日程表就可以通 过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割, 直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让

这2个选手进行比赛就可以了。 五、算法源代码及用户程序 (1)编写一个简单的程序,实现归并排序。 #include #include<> #define MAX 10 using namespace std; void merge(int array[],int p,int q,int r) { int i,k; int begin1,end1,begin2,end2; int* temp = new int[r-p+1]; begin1 = p; end1 = q; begin2 = q+1; end2 = r; k = 0; while((begin1 <= end1)&&(begin2 <= end2)) { if(array[begin1] < array[begin2]) { temp[k] = array[begin1]; begin1++; } else { temp[k] = array[begin2]; begin2++; } k++; } while(begin1 <= end1) { temp[k++] = array[begin1++]; }

Java_swt实现_分治法循环赛日程表_论文

附件二【学生用】《算法分析与设计》综合训练实习报告题目:利用分治思想设计循环赛日程表 学号 姓名 专业班级 指导教师 实践日期

目录 一、综合训练目的与要求 (1) 二、综合训练任务描述 (1) 三、算法设计 (1) 四、详细设计及说明 (3) 五、调试与测试 (5) 六、实习日志 (6) 七、实习总结 (6) 八、附录:核心代码清单 (6)

一、综合训练目的与要求 本综合训练是软件工程专业重要的实践性环节之一,是在学生学习完《算法分析》课程后进行的综合练习。本课综合训练的目的和任务: 1. 巩固和加深学生对算法分析课程基本知识的理解和掌握; 2. 培养利用算法知识解决实际问题的能力; 3. 掌握利用程序设计语言进行算法程序的开发、调试、测试的能力; 4. 掌握书写算法设计说明文档的能力; 5. 提高综合运用算法、程序设计语言、数据结构知识的能力。 二、综合训练任务描述 假设有n=2k 个运动员要进行网球循环赛。设计一个满足一下要求的比赛日程表: 1. 每个选手必须与其他n-1个选手各赛一次 2. 每个选手一天只能赛一次 3. 循环赛一共进行n-1天 利用Java语言开发一个界面,输入运动员的个数,输出比赛日程表。对于输入运动员数目不满足n=2k时,弹出信息提示用户。 三、算法设计 (1) 文字描述 假设n位选手顺序编号为1,2,3……n,比赛的日程表是一个n行n-1列的表格。i行j列的表格内容是第i号选手在第j天的比赛对手。 根据分而治之的原则,可从其中一半选手的比赛日程,导出全体n位选手的的日程,最终细分到只有两位选手的比赛日程出发 (2)框图

单循环赛赛程安排算法研究

单循环赛赛程安排算法研究 摘要:循环赛赛程安排算法是一个很经典的计算机算法,它是分治法的一个经典应用,但该算法只适应于2n支队伍的赛程安排问题,而对于非2n支队伍的赛程安排问题却没有很好的解决。文章使用可视化语言Visual Basic作为开发工具,借助于循环队列的规律,针对任意n支队伍的赛程安排提出一种直观、方便的算法。 关键词:单循环赛;赛程安排;算法;Visual Basic 6.0 中图分类号:TP312文献标识码:A文章编号: 1009-3044(2007)15-30805-02 Single Cycle Match Competition Schedule Arrangement Algorithm Research ZHANG Lin-zhong (Anhui Agricultural University,College of Applied Mathematics Institute,Hefei 230036) Abstract:Round robin schedule algorithm is a classic computer algorithm,it is a representative application of the divide and rule algorithm, but the classical computer algorithm can solve match arrangement of 2n teams only, it can not satisfactorily resolve the problem of not 2n teams. The article using Visual Basic as a development tool, using cohort cycle of

使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告

《算法设计与分析》 课程设计报告 题目:循环赛日程表 院(系):信息科学与工程学院 专业班级:软工 学生姓名: 学号: 指导教师: 2018 年 1 月 8 日至 2018 年 1 月 19 日

算法设计与分析课程设计任务书

目录 1 常用算法 (1) 1.1分治算法 (1) 基本概念: (1) 1.2递推算法 (2) 2 问题分析及算法设计 (5) 2.1分治策略递归算法的设计 (5) 2.2 分治策略非递归算法的设计 (7) 2.3 递推策略算法的设计 (8) 3 算法实现 (9) 3.1分治策略递归算法的实现 (9) 3.2 分治策略非递归算法的实现 (10) 3.3 递推策略算法的实现 (12) 4 测试和分析 (15) 4.1分治策略递归算法测试 (15) 4.2分治策略递归算法时间复杂度的分析 (16) 4.3 分治策略非递归算法测试 (16) 4.4分治策略非递归算法时间复杂度的分析 (17) 时间复杂度为:O(5^(n-1)) (17) 4.5 递推策略算法测试 (17) 4.6 递推策略算法时间复杂度的分析 (18) 时间复杂度为:O(5^(n-1)) (18) 4.7 三种算法的比较 (18) 5 总结 (19) 参考文献 (20)

1 常用算法 1.1分治算法 基本概念: 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。 基本思想及策略: 分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。 如果原问题可分割成k个子问题,1

循环赛日程表分治算法(c语言)

/* * 设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: * 每个选手必须与其他n-1个选手各赛一次; * 每个选手一天只能参赛一次; * 循环赛在n-1天内结束。 * 数组a[i][j]第i个选手在第j天所遇到的选手。 */ #include #include void gametable(int k) { int a[100][100]; int n,temp,i,j,p,t; n=2;//k=0两个参赛选手日程可以直接求得 a[1][1]=1;a[1][2]=2; a[2][1]=2;a[2][2]=1; for(t=1;t

单循环赛日程表

题目:循环赛日程表 设计一个满足一下要求的比赛日程表 (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)若才赛选手为偶数,循环赛一共进行n-1天;若参赛选手为奇数循环赛一共进行n天。主要思想:“贝格尔”编排法,其优点是单数队参加时可避免第二轮的轮空队从第四轮起每场都与前一轮的轮空队比赛的不合理现象。 方法如下: 所谓贝格尔编排法,第一轮开始的编排同传统方法一样,假设现在有7个队参加单循环,分别抽签成为1-7队,由于贝格尔编排法必须是双数队,所以再加一个0队,与0队比赛表示该队轮空,现在必须定下一个数为参照数,因此我们假设0为参照数(任意数都可以,一般取0或者最大数),第一轮的对阵形式如下: 1 – 0 2 – 7 3 – 6 4 – 5 这个大家都能看明白,这跟贝格尔编排法无关,第二轮则开始相关了。在第一轮中,0在右边,现在我们要在第二轮让它换成左边,第三轮又让它换回右边,反反复复,到最后一轮即第七轮时,它还是在右边。我们把0安排好后,再把第一轮右下角的5提到右上角来,因此第二轮的第一场比赛就变成: 0 – 5 然后我们还要回到第一轮的八个数字来,我们假设它是一个环,无论是顺时针还是逆时针,它们的位置是相对固定的(除了它们与0的位置有时候会改变外,因为0的位置是先定好的),比如按照顺时针方向看,5的前面是6,后面是4,因此,第二轮我们还是安排5的前面是6,后面是4,0我们假设它不存在,于是第二轮的第一、二场比赛就是: 0 – 5 6 – 4 那其他怎么办呢,照旧轮呗,就像排球的轮转一样,于是第二轮就是 0 – 5 6 – 4 7 – 3 1 – 2 其他依次类推。 无论比赛队是单数还是双数,最后一轮时,必定是“0”或最大的一个代号在右上角,“1”在右下角。 根据参赛队的个数不同,应按规定的间隔数移动(见表)。 间隔移动

循环赛问题分析与C语言代码分治法

问题描述:设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。 分析过程: 这个问题的解搜索空间是一个n的全排列。要求的解是其中的n个排列,满足条件:第1列n个元素值按增序排列;每行每列没有相同的数。也是一个幻方(除对角线的和不作要求)的问题。 =1 1) 1 2. n=2 (表2) 1 2 2 1 =3, (1) 添加一个虚拟选手4#,构成n+1=4 (2) 4/2=2,分两组,每组各自安排(1 2),(3 4) (3)每组跟另一组分别比赛(拷贝)这是四个人比赛的安排 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 (4)把虚选手置为0 (表4)3人赛程 1 2 3 0 2 1 0 3 3 0 1 2 0 3 2 1 这是三个人比赛的安排 4. n=4, 见表3 5. n=5, (1)加一个虚选手,n+1=6。安排好6个人的比赛后,把第6个人用0表示即得5人的。 (2) 分成两组(1 2 3) (4 5 6),各3名选手 (3) 依照表4,安排第1组;按表5安排第2组(除0元素外,都加3) (表5) 4 5 6 0

5 4 0 6 6 0 4 5 0 3 2 1 (4) 把表5排于表4下方 1 2 3 0 2 1 0 3 3 0 1 2 4 5 6 0 5 4 0 6 6 0 4 5 (5) 把同一天都有空的两组安排在一起比赛(按这种安排,肯定每天只有一对空组,?)。 1 2 3 4 2 1 5 3 3 6 1 2 4 5 6 1 5 4 2 6 6 3 4 5 (6) 第一组的(1 2 3)和第2组的(4 5 6)分别比赛。但是由于(1,4), (2, 5), (3 6)已经比赛过了,所以在后面的安排中不能再安排他们比赛。 1 2 3 4 5 6 首先,1#只能和5#或6#比赛。 (a)若1#-5#,由于3#和6#已经比赛过,所以只能安排: 2#-6#,3#-4# (b)若1#-6#,由于2#和5#已经比赛过,只能安排:2#-4#,3#-5# 这样安排后前三行的后两列,后三行的后两列由上面的三行来定: 1 2 3 4 5 6 2 1 5 3 6 4 3 6 1 2 4 5 4 5 6 1 3 2 5 4 2 6 1 3 6 3 4 5 2 1 表8就是6名选手的比赛日程安排。将其中的6号作为虚拟选手,把6换成0,即得5名选手的赛程安排表:

循环赛日程表_文档

循环赛日程表文档 一、问题描述: 设有n个运动员要进行循环赛。现要设计一个满足以下要求的比赛日程表: 1.每个选手必须与其他n-1个选手各赛一次; 2.每个选手一天只能参赛一次; 3.n是偶数时,循环赛在n-1天内结束。n是奇数时,循环赛进行n天. 二:程序源代码: #include #include void Table ( int **a , int n); int main() { int i=1,j; int days,n; int **a; //日程表数组 printf("请输入运动员人数:"); scanf("%d",&n); if (n<=1) printf("不可能出现此数据"); else { a=new int* [n+1]; //行表示运动员 days = n%2==0?n-1:n; //比赛天数,n是偶数时,n-1天。n是奇数时,n 天. for(i=1;i<=(n+1);i++) a[i] = new int [days+1]; } if(n%2!=0) Table(a,n); else { Table(a,n-1); //加入第n个运动员的比赛日程,只需将其加入到前n-1个运动员日程中轮空位置即可 for(i=1;i<=n;i++) { a[i][i]=n;

a[n][i]=i; } } //输出表头 printf("\n "); for(j=1;j<=days;j++) printf("第%d天 ",j); printf("\n"); //输出比赛日程 for(i=1;i<=n;i++) { printf("第%d号 ",i); for(j=1;j<=days;j++) printf("%d ",a[i][j]); printf("\n"); } printf("\n"); system("pause"); } void Table ( int **a , int n) { int i,j,m1,m2; int *b; //指向对阵关系数组 //建立初始对阵关系(,n-1,2,n-2,...,i,n-i) b=new int [n]; //0下标不用 for(i=1;i<=n/2;i++) { b[2*i-1]=i; b[2*i]=n-i; } for(i=1;i<=n;i++)//i控制天数变化 { a[i][i]=0; //n为奇数时在第i天第i号运动员轮空 for(j=1;j<=(n-1);j+=2) { //第i天m1与m2对阵 m1=((b[j]+i)<=n)?(b[j]+i):(b[j]+i)%n; m2=((b[j+1]+i)<=n)?(b[j+1]+i):(b[j+1]+i)%n; a[m1][i]=m2; a[m2][i]=m1; }

双循环赛的编排方法

(二)双循环赛的编排方法 双循环赛比赛轮次表的排法与单循环相同,只要排出第一循环,第二循环可按表重复一次(表3),也可重新抽签另排位置。第二循环的比赛如何进行,应在竞赛规程中明确规定。双循环赛的轮次与场次,均为单循环的一倍。 表3 5个队参加双循环比赛轮次安排表 第一轮第二轮第三轮第四轮第五轮 第一循环0——50——40——30——20——1 1——45——34——23——12——5 2——31——25——14——53——4 第二循环0——50——40——30——20——1 1——45——34——23——12——5 2——31——25——14——53——4 (三)分组循环赛的编排方法 分组循环通常分预赛和决赛两个阶段。 1.预赛阶段 按规程规定将参赛队分为几个小组,各组参照单循环编排,排出小组比赛表,然后确定种子队的位置。分组循环赛一般按分组数或分组数的2倍数确定种子,若种子数与组数相等,则将种子队分别安排在各小组的1号位置,如种子队为组数的2倍,应采用“蛇形”排列法,将种子队依次排列在各小组的1、2号位置上,非种子队也应抽签后定位。现将分组单循环赛抽签和“蛇形”排列法介绍如下: (1)首先在联席会上协商确定种子队:种子队数一般等于组的组数。如果分4个组进行比赛,应有4个种子队。为了使比赛更合理,也可以多选出几个种子队,但必须是组数的倍数。如分4个组进行比赛,可确定8个种子队。第一号种子队与第八号种子队编为一组;第二号种子队与第七号种子队编为一组,依此类推。 (2)抽签方法:种子队先抽签,确定各种子队的组别,然后其他各队再抽签确定组别。

例如,20个队分为4组,除8个种子队外,其他12个队再抽签。签号分为4组,每组有相同的3个签,由12个队抽签确定组别,然后再把各队按组别填入各组的比赛轮次表中。另外一种分组方法为蛇形排列分组,即按上一届名次进行分组。例如,有16个队分为4个组时,其排法如表4: 表4 16个队分4组比赛安排表 第一组第二组第三组第四组 1234 8765 9101112 16151413 2.决赛阶段 各队在预赛阶段分组单循环赛中的名次,将决定其进入决赛阶段比赛的位置。在预赛阶段已经相遇过的队,比赛成绩依然有效,决赛阶段不再进行比赛。其常用的比赛方法有,同名次赛、分段赛、交叉赛、录取名次赛等。 (1)同名次赛:就是将各小组预赛中相同名次编在一起进行比赛,如预赛时四个组的第一名编成一组进行单循环赛,决出1~4名,各小组的第二名编在一起决出5~8名。 (2)分段赛:将各小组的名次分为几段,同一段名次的队编在一组决出总名次,如预赛两个组的1、2名编在一起决出1~4名,两个组的3、4名,编在一起排出5~8名。 (3)交叉赛:各组的前两名交叉比赛,两场胜者进行决赛争夺1、2名,两场负者再相互比赛决出3、4名,各组3、4名用同样方法决出5~8名,其余类推。 (4)录取名次赛:根据竞赛规程规定的录取名次,在各小组中取录数量相等的队进入决赛(参加第二阶段决赛队的数量应等于或略高于录取名次的队)。例如,有16个队参赛,规定录取前8名,预赛分成两个组,则每组前4名的队,进入第二阶段决赛,其余的队不再比赛。 (四)循环比赛日程编排的注意事项 循环赛要求每个参赛队(人)和其他参赛队之间都要进行比赛。从比赛对象上看,保证了参加者均等的机会,但在比赛顺序和比赛条件上仍存在着机会不均等的问题。如与强、弱对手相遇时间的先后问题;实力相近两队之间决定性比赛前,各自体力消耗多少的问题(指各自在前一场比赛对手的强弱和休息间隔时间的不均等);各参赛队比赛进度先后不一致问题;比赛场地条件的优劣及对场地条件适应能力等问题。要做到各方面条件完全均等是不可能的,但在编排中应尽量使这些不均等因素降到最低限度,使整个比赛获得更好效果。

算法分析——分治法

分治算法 小组的汇报内容: 一、分治算法的基本概念 (2) 二、分治算法的基本思想及策略 (2) 三、分治法适用的情况 (3) 四、分治法的基本步骤 (3) 五、分治法的复杂性分析 (4) 六、快速傅里叶变换 (5) 七、可使用分治法求解的一些经典问题 (9) 八、依据分治法设计程序时的思维过程 (9) 九、分治法与其它常见算法的比较 (9) 小组的分工情况: 彭勇讲前五个部分,天西山讲第六个部分,胡化腾讲最后三个部分,吕璐负责汇报的资料收集,小组分工以及最后的资料整理。

三、分治法适用的情况 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加; 第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;、 第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。 第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。 四、分治法的基本步骤 分治法在每一层递归上都有三个步骤: step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

循环赛日程表设计源代码

#include #include const int N=100; int a[N][N]; void Copy(int i1,int j1,int i2,int j2,int n){ for(int k1=0;k1

相关主题
相关文档
最新文档