循環賽日程表(分治策略)
阿新 • • 發佈:2018-11-27
name height mes scanf pan code com iostream from
問題:設有n=2^k個選手參加循環賽,要求設計一個滿足以下要求比賽日程表:
1)每個選手必須與其它n-1個選手各賽一次;
2)每個選手一天只能賽一次。
1 //循環賽日程表 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 using namespace std; 6 int a[100][100]; 7 8 void Copy(int tox,int toy,int fromx,int fromy,int r){ 9 for( int i = 0; i < r; i++ )10 for( int j = 0; j < r; j++ ){ 11 a[tox+i][toy+j] = a[fromx+i][fromy+j]; 12 } 13 } 14 15 void Table(int k){ 16 int n = 1<<k; 17 for( int i = 0; i < n; i++ ) 18 a[0][i] = i+1; 19 for( int r = 1; r < n; r = r<<1 ) 20 for( int i = 0; i < n; i = i+r*2 ){ 21 Copy(r,r+i,0,i,r); 22 Copy(r,i,0,r+i,r); 23 } 24 } 25 26 void Out(int n){ 27 for( int i = 0; i < n; i++ ){ 28 for( int j = 0; j < n; j++ ) 29 printf("%3d",a[i][j]); 30 cout<<endl; 31 } 32 cout<<endl;33 } 34 35 int main(){ 36 int k; 37 while( scanf("%d", &k) != EOF ){ 38 int n = 1<<k; 39 Table(k); 40 Out(n); 41 } 42 return 0; 43 }
循環賽日程表(分治策略)