问题描述:
n=2
k
个运动员进行“
地表最强
16
人
”循环赛,日程满足:
•
每个选手必须与其他
n-1
个选手比赛一次;
•
每个选手一天只能赛一次;
•
循环赛一共进行
n-1
天。
实验要求
•
输入:
n——
参加循环赛的运动员人数
•
输出:日程表的详细安排(行:运动员;列:一天;间隔:
/t
)
保存结果(学号
+
“
_
循环赛”
+.txt
)
•
程序:分治过程必须通过递归函数
Scheduled(
int
i
,
int
size)
表达
其中 i表示目前正在解决的日程表起始位置 size代表需要解决的大小
•
注:调用过程禁止直接写在主函数中!
因为老师要求特殊,没什么可以参考的程序,便自己研究研究写了一个,基本上自己的算法实验都是晚上在没人的地方研究一晚上便搞出来的。
#include<stdio.h>
#define N 100
int a[N][N];
void Scheduled(int i,int size)
{
int x,y;
if(size == 2)// size=2是最小问题,判断是否是最小的终止条件,是就赋值(事实赋值了第一列)
{
a[i][1]=i;
a[i+1][1]=i+1;
//return;
}
else{
Scheduled(i,size/2);//左上部分的递归完成第一列
Scheduled(i+size/2,size/2);//左下部分的递归完成第一列
}
for(x=i;x<i+size/2;x++)//一次性填充半个子表,上半部分的表格,此右上部分内容完全复制左下部分
for(y=size/2+1;y<=size;y++){//左右对称进行填充
a[x][y]=a[x+size/2][y-size/2];//填充表格
//printf("I am a[%d][%d] is %d\n",x,y,a[x][y]);
}
for(x=i+size/2;x<i+size;x++)//此右下部分内容完全复制左上部分
for(y=size/2+1;y<=size;y++){
a[x][y]=a[x-size/2][y-size/2];
//printf("I am a[%d][%d] is %d\n",x,y,a[x][y]);
}
}
void Print(int n){
int p,q;
FILE *fp;
fp=fopen("e:\\222015325012065_循环赛.txt","wb");
printf("每行第一列指运动员编号,从第二列起指此运动员在第一天到最后一天要比赛的选手。\n");
fprintf(fp,"每行第一列指运动员编号,从第二列起指此运动员在第一天到最后一天要比赛的选手。\r\n");
for(p=1;p<=n;p++){
for(q=1;q<=n;q++){//第一列为参赛人员
printf("%d\t",a[p][q]);
fprintf(fp,"%d\t",a[p][q]);
}
printf("\n");
fprintf(fp,"\r\n");
}
fclose(fp);
printf("e盘的222015325012065_循环赛.txt has been finished!\n");
}
int main(){
int n;
printf("Please input the value of n:\n");
scanf("%d",&n);
Scheduled(1,n);
Print(n);
return 0;
}