问题
有n个人参加比赛,两两进行比赛且每天只有一场,求日程表安排
分析
n个人可划分为2组n/2的人参赛,继续划分,当只有两个人时,直接安排即可。
重点是左上角给右下角,左下角给右上角的赋值
代码实现
#include<stdio.h>
#define N 100
int a[N][N]={0};
void table(int n,int k){
int i,j;
if(n==2){//只有两个队伍时直接安排
a[k][0]=k+1;
a[k][1]=k+2;
a[k+1][0]=k+2;
a[k+1][1]=k+1;
}else{
table(n/2,k);//划分为小问题
table(n/2,k+n/2);
for(i=k;i<k+n/2;i++){//赋值左下角的到右上角
for(j=n/2;j<n;j++){
a[i][j]=a[i+n/2][j-n/2];
}
}
for(i=k+n/2;i<k+n;i++){//赋值左上角的到右下角
for(j=n/2;j<n;j++){
a[i][j]=a[i-n/2][j-n/2];
}
}
}
}
int main()
{
int n,i,j;
scanf("%d",&n);//n个队伍
table(n,0);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}