为参加网球比赛的选手安排比赛日程。 设有n(n=2k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选手每天赛一场,不轮空。试按此要求为比赛安排日程。 设n位选手被顺序编号为1,2,…,n。比赛的日程表是

admin2012-03-13  47

问题 为参加网球比赛的选手安排比赛日程。
   设有n(n=2k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选手每天赛一场,不轮空。试按此要求为比赛安排日程。
   设n位选手被顺序编号为1,2,…,n。比赛的日程表是一个n行n-1列的表,i行j列的内容是第i号选手第j天的比赛对手。用分治法设计日程表,就是从其中一半选手(2m-1位)的比赛曰程,导出全体(2m位)选手的比赛日程。从只有2位选手的比赛日程出发,反复这个过程,直到为n位选手安排好比赛日程为止。
   [C函数]
   #include<stdio.h>
   #define MAXN  64
   int a[MAxN+1][MAXN];
   void main()
   {  int twoml,twom,il,j,m,k;
      printf("指定n(n=2的k次幂)位选手,清输入k。\n");
      scanf("%d",&k);
      a[1][1]=2;    /*预设2位选手的比赛日程*/
      a[2][1]=1;
      m=1;twoml=1;
      while(m<k){
       (1)  ;
      twoml+=twoml;    /*为2m位选手安排比赛日程*/
     (2)  ;
   /*填日程表的左下角*/
   for(il=twoml+l;il<=twom;i1++)
     for(j=1;j<=twoml-1; j++)
       a[i1][J]=a[i1-twoml][j]+twoml;
     (3)  ;
   for(i1=2;i1<=twom;i1++)a[i1][twoml]=a[i1-1][twom1]+l;
     for(j=twoml+1;j<twom;j++){
       for(i1=1;i1<twoml;i1++)  a[i1][j]=a[i1+1][j-1];
     (4)  ;
     }
   /*填日程表的右下角*/
   for(j=twoml;j<twom;j++)
     for(ii=i;i1<=twoml;i1++)
       (5)  ;
   for(i1=1;i1<=twom;i1++){
     for(j=1;J<twom;j++)
       printf("%4d",a[i1][J]);
     printf("\n");
   }
   printf("\n");
   }
}

选项

答案(1) m++ (2) twom+=2*twom1 (3) A[1][twoml]=twom1+1 (4) A[twom1][j]=a[1][j-1] (5) A[a[i1][j][j]=i1

解析 分别有2位、4位、8位选手参加比赛时的日程表。若1~4号选手之间的比赛日程填在日程表的左上角(4行3列),5~8号选手之间的比赛日程可填在日程表的左下角(4行3列),而左下角的内容可由左上角对应项加上数4得到。至此剩下的右上角(4行4列)是为编号小的1~4号选手与编号大的5~8号选手之间的比赛安排日程。程序的思路是:由2位选手的比赛日程得到4位选手的比赛日程;依次得到8位选手的比赛日程。
转载请注明原文地址:https://jikaoti.com/ti/u5W7FFFM
0

相关试题推荐
最新回复(0)