設有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("\n"); } } int main() { int k; scanf("%d",&k); if(k!=0) match(k); }