当前位置:文档之家› 单循环小组赛赛程表(甲组).

单循环小组赛赛程表(甲组).

单循环小组赛赛程表(甲组).
单循环小组赛赛程表(甲组).

A——炼油二部飞虎队B——炼油三部飞腾队C——炼油四部飞翔队D——化工部飞昇队E——炼油五部飞鹰队F——炼油一部风暴队

A——仪控部精细队B——质管中心共建队C——公用工程部火龙队D——储运部火炬队E——电气部闪电队

淘汰赛赛程表

循环赛的方法与编排

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

网球循环赛日程表

一、问题表述: 设有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开始编号)

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

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

循环赛日程表问题研究

学年论文 题目循环赛日程表问题研究 学生 指导教师 年级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

(完整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) 框图

用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<<"参赛人数"<<" "<

单循环赛日程表

题目:循环赛日程表 设计一个满足一下要求的比赛日程表 (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”在右下角。 根据参赛队的个数不同,应按规定的间隔数移动(见表)。 间隔移动

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

摘要 分治算法在实际中有广泛的应用,例如,对于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。

循环赛日程表_文档

循环赛日程表文档 一、问题描述: 设有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名的队,进入第二阶段决赛,其余的队不再比赛。 (四)循环比赛日程编排的注意事项 循环赛要求每个参赛队(人)和其他参赛队之间都要进行比赛。从比赛对象上看,保证了参加者均等的机会,但在比赛顺序和比赛条件上仍存在着机会不均等的问题。如与强、弱对手相遇时间的先后问题;实力相近两队之间决定性比赛前,各自体力消耗多少的问题(指各自在前一场比赛对手的强弱和休息间隔时间的不均等);各参赛队比赛进度先后不一致问题;比赛场地条件的优劣及对场地条件适应能力等问题。要做到各方面条件完全均等是不可能的,但在编排中应尽量使这些不均等因素降到最低限度,使整个比赛获得更好效果。

循环赛日程表设计源代码

#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

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

《算法设计与分析》 课程设计报告 题目:循环赛日程表 院(系):信息科学与工程学院 专业班级:软工 学生姓名: 学号: 指导教师: 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

单循环比赛日程安排

单循环比赛日程安排 一、摘要: 本文在合理假设的基础上由问题的数学实质,建立出问题的模板模型,并根据问题的特殊性将模板分为奇数和偶数两种来研究,运用归纳的方法发现了列出矩阵后的特殊规律,根据这些规律得出一般模型,把模型与矩阵相对应,即得出日程安排的结果,并把模型一般化,使之能广泛应用于日程安排中,给出一个性能指标,用于判断日程安排是否公平、适合 对模型进行了推广。 二、问题重述: 1)七支球队进行单循环比赛,每天一场,每个队伍在两场比赛之间至少间隔一天, 2)若变成八支,九支,如何安排合理。能是两只球队至少 间隔两天吗。 3)推广到N支球队的比赛,如何安排,每支球队两场比赛之间至少间隔多少天。 4)你建议用那些指标衡量比赛日程的优劣,如何使这些指标达到最优。 三、建模假设: 1)每天的同一天进行比赛。

2)符号假设 i j 第i 队与第j 队比赛 [x]第x 场比赛 x(ij)第i 队与第j 队的比赛在第x(ij)场 N 球队的总支数 四、分析与建立模型: (1) 建模思路:首先用矩阵的方式把每场比赛列出来(顺序列出),从矩阵中的到一定规律,通过专业人士以前得出的日程安排概况,按一定规律建立一个模板,把矩阵与模板相应的值对应,比赛日期=比赛开始日期+x(ij)-1。 首先,建立一个关于x(ij)矩阵,i 代表行,j 代表列。 ???? ??? ???? ??? ??? ?? ? ? ?)77() 76() 75() 74() 73() 72()71()67()66()65()64()63()62()61()57()56()55()54()53()52()51()47()46()45()44()43()42()41()37()36()35()34()33()32()31() 27()26()25()24()23()22()21()17()16()15()14()13()12() 11(x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x ii 这种情况不存在,ij 与ji 意义相同,为了简便,我们只看对角线上半部分, 既得:

要求:编写程序,用分治法求解循环赛日程表。

要求:编写程序,用分治法求解循环赛日程表。 一、实验目的与要求 1、掌握网球循环赛日程表的算法; 2、初步掌握分治算法 二、实验题: 问题描述:有n=2^k个运动员要进行循环赛。现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次 (2)每个选手一天只能赛一次 (3)循环赛一共进行n-1天 三、实验代码 #include #include #define MAX 1024 int a[MAX][MAX]; void Copy(int tox, int toy, int fromx, int fromy, int n) { int i, j; for (i=0; i

循环赛日程表

算法设计与分析实验报告循环赛日程表

一.问题描述 设有n位选手参加循环赛,设计循环赛日程表,要求: 每位选手必须和其余n-1个选手比赛; 每位选手每天只能比一场比赛; 若n为奇数,则比赛n天; 若n为偶数,则比赛n-1天。 二.实验目的 熟悉分治法的思想并掌握其运用。 三.实现方式 编译环境:Dev-C++ 算法思路: 使用分治法的思想,给n个选手安排日程表转化为给n/2个选手安排日程表,直到问题规模变成给两个选手安排日程。 日程表可以用一个二维数组表示,数组的大小为k (n<=2^k),第i行第j列的数组值表示第i个选手在第j-1 天比赛的对手(第1列表示选手的编号,假定选手的编号为1, 2,3…恰为数组的行数)。 划分:n个选手的日程表可以由n/2个选手的日程表合并而得。 解决:当只有两个选手比赛的时候,可以直接给出其日程表,得到一个2×2的数组。

当有4个选手参加比赛的时候,则将两个2×2的数组合并,得到一个4×4的数组。 以此类推,n 个选手的日程表由n-1个选手的日程表合并而成。合并规则为: 若n 为偶数,则会得到一个n ×n 的表格;若n 为奇数,需要比赛n 天,则会得到一个n ×(n+1)的表格且每一天必定有一位选手轮空。因此在合并的时候要先把表格扩充为(n+1)×(n+1)的表格,然后再消除虚拟的选手(用0表示轮空)。 例:n=3时赛程表为: 当n=6时,将两个n=3的赛程表合并,在同一天轮空的选手便可 在该天比赛。然后再补上表格右边的元素。

设当前要合并的数组的长度为s,表格左下角的元素可由左上角的元素+s而得: 表格右上角的元素由前一行决定: 表格右下角的元素由表格右上角对应元素所决定:

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

/* *设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: *每个选手必须与其他n-1个选手各赛一次; *每个选手一天只能参赛一次; *xx在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

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);}

相关主题
文本预览
相关文档 最新文档