设有n=2k个选手参加比赛,要求设计一个满足一下要求的比赛日程表:
(1)每个选手必须与其他的n-1个选手个比赛一次;
(2)每个选手每天只能赛一次 。
(3)循环赛一共进行n-1天
设计一个比赛日程表,该表有n行和n-1列,第i行j列为第i个选手第j天遇到的选手
#include<stdio.h> #include<math.h> int a[100][100]; void match(int k) { int n,temp,i,j; n=2; //k=0两个参赛选手日程可以直接求得 a[1][1]=1; a[1][2]=2; a[2][1]=2; a[2][2]=1; for(i=1; i<k; i++) //迭代处理,依次处理2^n....2^k个选手的比赛日程 { temp=n; n=n*2;//填左下角元素 for(i=temp+1; i<=n; i++) for(j=1; j<=temp; j++) a[i][j]=a[i-temp][j]+temp;//左下角和左上角元素的对应关系 for(i=1; i<=temp; i++) //将左下角元素抄到右上角 for(j=temp+1; j<=n; j++) a[i][j]=a[i+temp][(j+temp)%n]; for(i=temp+1; i<=n; i++) //将左上角元素抄到右下角 for(j=temp+1; j<=n; j++) a[i][j]=a[i-temp][j-temp]; } for(i=1; i<=n; i++) for(j=1; j<=n; j++) { printf("%d ",a[i][j]); if(j==n) printf(" "); } } int main() { int k; scanf("%d",&k); if(k!=0) match(k); }