阅读下列函数说明和C代码,将应填入(n)外的字句写在对应栏内。 [说明] 为网球比赛的选手安排比赛日程。设有n(n=2m)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选手每天赛一场,不轮空。 设

admin2010-12-17  19

问题 阅读下列函数说明和C代码,将应填入(n)外的字句写在对应栏内。
   [说明]
   为网球比赛的选手安排比赛日程。设有n(n=2m)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选手每天赛一场,不轮空。
   设n位选手被顺序编号为1,2,…,n,比赛的日程表是一个n行n-1列的表,第i行j列的内容是第i号选手第j天的比赛对手。用分治法设计日程表,就是从其中一半选手(2m-1位)的比赛日程导出全体2m选手的比赛日程。从众所周知的只有两位选手的比赛日程出发,反复这个过程,直至为n位选手安排好比赛日程为止。
   如两位选手比赛日程表如下所示:

如四位选手比赛日程表如下所示:

   函数中使用的预定义符号如下:
   #define M 64
   int a[M+1][M];
   [函数]
   voidd main(){
   int twoml,twom,i,j,m,k;
   printf("指定n(=2的k次幂)位选手,请输入k:\n");
   scanf("%d",&k);
   /*8预设两位选手的比赛日程*/
   a[1][1]  =2;
   a[2][1]  =1;
   m=1;
   twoml=1;
   while (  (1)  ){
   m++;
   twoml+=twoml;
   twom=twoml*2;/*为2^m位选手安排比赛日程*/
   /*填日程表的左下角*/
   for(i=twoml+1;  (2)  ;i++){
   for(j=1; j<=twoml-1; j++){
   a[j]=a[i-twoml][j]+twoml;
   }
   }
   /*填日程表的右上角*/
   a[1][twoml]=  (3)  ;/+填日程表右上角的第1列*/
   for(i=2; i<=twoml; i++){
   a[twoml]=a[i-1][twoml]+1;
   }
   /*填日程表右上角的其他列,参照前一列填当前列*/
   for(j=twoml+1; j(twom;j++){
   for(i=1; i    a[j]=  (4)  ;
   }
   a[twoml][j]=a[1][j-1];
   }
   /*填日程表的右下角*/
   for(j=twoml; j    for(i=1;i<=twoml; i++){
   a[  (5)  [j]=i;
   }
   }
   /*输出日程表*/
   for(i=1; i<=twom; i++){
   for(j=1;j    printf("%4d",a[j]);
   }
   printf("\n");
   }
   printf("\n");
   }
   }
(2)

选项

答案i<=twom

解析 以下各空的判断略有难度,可通过举例法,亦即模拟执行,来生成四位选手(k为2)的比赛日程。
   空(2)应填当前问题规模中行下标的最大值,分析得当前规模行下标最大为twom,对应四位选手为4,故空(2)应填i<=twom。
转载请注明原文地址:https://jikaoti.com/ti/g9i7FFFM
0

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