“循环赛日程安排”问题的分而治之解决算法

原创 2007年10月05日 21:54:00
/**//*
    标题:<<系统设计师>>应试编程实例-[分而治之算法程序设计]
    作者:成晓旭
    时间:2002年09月15日(11:58:00-13:18:00)
          实现“装箱”问题的贪婪算法实现函数

*/

#include    
"stdio.h"
#include    
"stdlib.h"

//:====================“循环赛日程安排”问题的分而治之解决算法====================
/**//*
    作者:成晓旭
    时间:2002年09月15日(11:58:38-20:00:00)
          完成“循环赛日程安排”问题的分而治之解决算法
    ===================================================
    问题描述:
            设有n(n = 2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与
        其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。试按此要求
        为比赛安排日程。

    编程思想:
            假设n位选手被顺序编号为1,2,3,...,n,比赛的日程表是一个n行n-1列的表格,
        i行j列的表格内容是第i号选手在第j天的比赛对手。
            根据分而治之的原则,可从其中一半选手(2^(n-1位)的比赛日程,导出全体n位
        选手的日程,最终细分到只有两位选手的比赛日程出发。
            可假设只有8位选手参赛,若1至4号选手之间的比赛日程填在日程表的左上角
        (4行3列),5至8号选手之间的比赛日程填在日程表的左下角(4行3列);那么左下角的
        内容可由左上角的对应项加上数字4得到。至此,剩余的右上角(4行4列)是为编号小的
        1至4号选手与编号大的5至8号选手之间的比赛日程安排。例如,在第4天,让1至4号选
        手分别与5至8号选手比赛,以后各天,依次由前一天的日程安排,让5至8号选手“循环
        轮转”即可。
        最后,比赛日程表的右下角的比赛日程表可由,右上角的对应项减去数字
        4得到。
    编程图例:
        
    ===================================================================
    |*| 选手    1天        2天        3天        4天        5天        6天        7天    |*|
    ===================================================================
    |*|    1号    |    2    |    3    |    4    ||    5    |    6    |    7    |    8    |*|
    |*|    2号    |    1    |    4    |    3    ||    6    |    7    |    8    |    7    |*|
    |*|    3号    |    4    |    1    |    2    ||    7    |    8    |    5    |    6    |*|
    |*|    4号    |    3    |    2    |    1    ||    8    |    5    |    6    |    5    |*|
    ========[左上角]========================[右上角]===================
    |*|    5号    |    6    |    7    |    8    ||    1    |    4    |    3    |    2    |*|
    |*|    6号    |    5    |    8    |    7    ||    2    |    1    |    4    |    3    |*|
    |*|    7号    |    8    |    5    |    6    ||    3    |    2    |    1    |    4    |*|
    |*|    8号    |    7    |    6    |    5    ||    4    |    3    |    2    |    1    |*|
    ========[左下角]========================[右下角]===================
*/

#define    MAXN    64
//日程表数组
int    calendar[MAXN + 1][MAXN];
void    Round_Robin_Calendar()
...{
    
int i,j,m,number,p,q;
    printf(
"输入选手个数:(注意:2^k) ");
    scanf(
"%d",&number);
    
//预置两位选手的比赛日程表://第i位选手第j天与第calendar[i][j]位选手比赛
    calendar[1][1= 2;        //第1位选手第1天与第2位选手比赛
    calendar[2][1= 1;        //第2位选手第1天与第1位选手比赛
    m = 1;
    p 
= 1;
    
while(m < number)
    
...{
        m 
++;
        
//p = p + p;
        p += p;
        q 
= 2 * p;    //为2^m位选手安排比赛日程
        
//填充日程表的左下角
        for(i = p + 1;i <= q;i++)
            
for(j = 1;j<= p - 1;j++)
                calendar[i][j] 
= calendar[i - p][j] + p;    //左下角的内容 = 左上角的对应项加上数字4[]
        
//填充日程表的右上角
        
//填充日程表的右上角的第1列
        calendar[1][p] = p + 1;        
        
for(i = 2;i <= p;i++)
            calendar[i][p] 
= calendar[i - 1][p] + 1;
        
//填充日程表的右上角的其他列,参照前一列填充当前列[循环轮转算法]
        for(j = p + 1;j < q;j++)
        
...{
            
for(i = 1;i < p;i++)
                calendar[i][j] 
= calendar[i + 1][j - 1];
            calendar[p][j] 
= calendar[1][j - 1];
        }

        
//填充日程表的右下角
        for(j = p;j < q;j++)
            
for(i = 1;i <= p;i++)
                calendar[calendar[i][j]][j] 
= i;    //关键语句
        for(i = 1;i <= q;i++)
        
...{
            
for(j = 1;j < q;j++)
                printf(
"%4d",calendar[i][j]);
            printf(
" ");
        }

        printf(
" ");
    }

}

//:====================“循环赛日程安排”问题的分而治之解决算法====================

int main(int argc, char* argv[])
...{
    Round_Robin_Calendar();
    printf(
" 应用程序运行结束! ");
    
return 0;
}


 

算法-分治法实例:循环赛日程安排问题

利用C语言实现分治法的一个实例——循环赛程问题
  • zhaotianyu950323
  • zhaotianyu950323
  • 2015年10月12日 21:09
  • 1037

分治法:循环赛日程安排问题

问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表: 1)每个选手必须与其它n-1个选手各赛一次; 2)每个选手一天只能赛一次。 分析,按照上面的要求,可以将比赛表设计成一个...
  • wly_2014
  • wly_2014
  • 2016年05月12日 23:00
  • 4388

循环赛问题 日程安排的一种排列方式 使用C++实现

笔试时遇到的题目,当时没有写出来。。。 球员个数仅限于2的k次方个,如2 4 8 16 32 。。。。,第一列表示球员的编号,从第二列开始分别表示比赛的时间第一天、第二天、第三天。。。。 #inclu...
  • lvmaolin1
  • lvmaolin1
  • 2013年07月11日 22:52
  • 340

循环赛日程表

问题描述:             设有n(n = 2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与         其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空...
  • u012516734
  • u012516734
  • 2015年02月11日 23:00
  • 589

【算法作业】 循环赛问题 分治算法

题目: 设有N个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表 (1)每个选手必须与其他n-1个选手各赛一次 (2)每个选手一天只能赛一次 (3)当n 是偶数,循环赛进行n-1天,当n是奇数...
  • zchahaha
  • zchahaha
  • 2016年05月11日 15:07
  • 2579

循环日程表问题

循环日程表问题 循环日程表问题。n=2kn=2^k个运动员进行网球循环赛,需要设计比赛日程表。每个选手必须与其他n−1n-1个选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n−1n-1天。按...
  • q547550831
  • q547550831
  • 2016年05月31日 14:10
  • 1754

循环赛日程表

•设有n个运动员要进行网球循环赛。设计一个满足下列条件的比赛日程表: –每个选手必须与其他n-1个选手各赛一次; –每个选手一天只能赛一次; –当n是偶数时,循环赛进行n-1天。 ...
  • ashjn2011
  • ashjn2011
  • 2013年04月13日 12:36
  • 478

分而治之的思想--最大子列和问题

问题描述:给定N个整数序列,{A1,A2,…,An},求该序列中存在的最大的连续n个整数和。...
  • Katherineljn
  • Katherineljn
  • 2017年03月08日 14:24
  • 462

循环赛日程表(计算机算法设计与分析 --王晓东) 2.11

参考博客:http://blog.csdn.net/liufeng_king/article/details/8488421 问题描述: 设有n = 2^k个运动员要进行网球循环赛。现要设计一个满...
  • llwwlql
  • llwwlql
  • 2016年09月07日 08:59
  • 1770

分治算法——循环赛日程安排问题(Java实现)

循环赛日程安排问题 设有16个运动员将进行网球循环赛。现要设计一个满足以下要求的比赛日程表:⑴ 每个选手必须与其它15个选手各赛一场,⑵ 每个选手一天只能赛一场,⑶ 循环赛进行15天。 算法实现: ...
  • zimou5581
  • zimou5581
  • 2016年11月05日 11:51
  • 237
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:“循环赛日程安排”问题的分而治之解决算法
举报原因:
原因补充:

(最多只允许输入30个字)