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

admin2014-10-11  26

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

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

函数中使用的预定义符号如下:
#define M 64
int a(M+1][M];
【函数】
void main(){
inttWoml,twom,i,j,m,k;
printf(“指定n(=2的k次幂)位选手,请输入k:\n”);
scanf(“%d”,  &k);
/*预设两位选手的比赛日程*/
a[1][1]=2;
a[2][1]=1;
m=1:
twoinl=1:
while((1)){
m++:
twoml+:twom1;
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][twom1]+1;
}
/*填日程表右上角的其他列,参照前一列填当前列*/
for(J=twoml+1;Jfor(i=1;ia[j]=  (4);
}
a[twoml][J]=a[1][j一1];
}
/*填日程表的右下角*/
for(J=twoml;Jfor(i:1;i<:twoml;i++){
a[(5)][j]=i;
}
}
/*输出日程表*/
for(i:1;  i<=twom;i++){
for(j=1;Jprintf(“%4d”,a[J]);   
} printf(“\I-I”);
}
printf(”\n”);
}
}

选项

答案(1)m<k (2)i←twom (3)twom1+1 (4)a[i+1][j一1] (5)a[i][j]

解析 题中已经说明该算法采用的是分治法,  “就足从其中一半选于(2m-1位)的比赛日程导出全体2m选手的比赛日程”,再根据注释,不难确定空(1)应填m<k。以下各空的判断略有难度,可通过举例法,亦即模拟执行,来生成四位选手(k为2)的比赛日程。
空(2)应填当前问题规模中行下标的最大值,分析得当前规模行下标最大为twom,对应四位选手为4,故空(2)应填←twom。空(3)填的右上角第一行第一列元素,对应四位选手为a[1][2],此值为3,即twom1+1,故空(3)应填twom1+1。比赛日程中,A与B比赛,那么B与A比赛,其时间是统一的,存在参照性,注释已说明是前一列,故列号应为j一1:至于行号,通过分析四位选手比赛日程,可总结出应为i+1。
故空(4)应填a[i+1][i—1]。同空(4),空(5)应为a[j]。
转载请注明原文地址:https://kaotiyun.com/show/MaDZ777K
0

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