首页 > 编程知识 正文

循环赛日程表分治策略递归算法(递归与分治策略算法之循环赛日程表)

时间:2023-05-05 11:16:29 阅读:121395 作者:1151

递归和分布式策略算法的循环调度1、先简单的来介绍一下分治策略的思想

分而治之战略的基本思想是,一个规模为n的问题分解为k个规模小的子问题,分解出的子问题与原问题相同且相互独立。 递归解决子问题,然后通过合并子问题的解得到原问题的解。

2、循环赛日程表问题的介绍

假设有n=2 k 2^k 2k名运动员进行网球循环赛,现在我们将设计符合以下要求的比赛时间表:

每名选手必须与其他n-1名选手进行一次比赛; 每个运动员一天只能比赛一次; 比赛共进行n-1天; 比赛时间表可以用n*(n-1 )表示。 日程表中第I行和第j列的值表示第I个选手在第j天遇到的选手。

根据分而治之战略,将所有选手分成两半,n名选手的比赛日程可以由n/2名选手的比赛日程决定。 至于剩下的两名选手,让这两名选手直接比赛就行了。

如图所示:

3、循环赛日程表问题的具体实现

实现想法:

如果只剩下两名选手(21 ) 121,直接让两名选手比赛; 2 2 2^2 22、232 ^323…依次处理2 k2 ^ k2k名运动员的比赛日程;

-比赛日程表左上和右下的要素相同,左下和右上的要素相同;

-比赛日程表左上角和左下角对应因素差距为n/2; 通过以上考虑,可以按顺序按位置填写比赛日程。

具体实施:

# include stdio.h # include stdlib.h /生成比赛表。 参数为比赛表arr[][],选手数n=2^kvoid Table(int arr[][9],int n序列下标从1开始的arr[1][2]=2; arr[2][1]=2; arr[2][2]=1; int i,j,half; //循环处理,2^2 . 2^k个选手比赛日程int num=2; //当前选手数numwhile(numn ) {half=num; //当前选手一半的num=num * 2; //处理当前选手人数(第一循环中4名选手)//右下for ) I=half1; i=num; I//行for(j=half1; j=num; j//列arr[i][j]=arr[i - half][j - half]; //处理左下角for (I=half 1; i=num; I ) for ) j=1; j=half; j ) arr[i][j]=arr[i - half][j] half; //这里第一个循环处理3、4号选手//右上的for (I=0; i=half; I ) for(j=half1; j=num; j ) arr[i][j]=arr[i half][j - half]; }}int main () intarr ) [9] ); table(arr,8 ); for(intI=1; i=8; I ) for(intj=1; j=8; j () if ) j==1) printf )、arr[i][j]; elseprintf('%d ',arr[i][j]; }printf((n ); }返回0; }实现结果:

tips :行动不一定带来幸福,没有行动永远不会带来幸福。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。