1、問題描述:
有n=2^k個遠動員選手,設計比賽日程表實現:
(1)每個選手必須與n-1個選手比賽
(2)每個選手一天只比賽一場
(3)比賽共進行n-1天
輸入:n人
輸出:n行n-1列,第i行第j列表示第i個選手第j天遇到的對手,不包含第一列表示為選手編號
舉例:2人
? ? ?1 ? 2
? ? ?2 ? 1
2、問題分析
通過化大為小,分而治之的思想,將多人的比賽日程縮小為2人的日程。以此倒推所有人的日程。
注意多人日程規律:
以四人為例:
1 2 |?3 4
2 1 | 4 3
----------
3 4 |?1 2
4 3 | 2 1
這樣一個矩陣分為四個區,左上和右下一樣,左下和右上一樣,且右上是左上對應的數字加了n/2.
3、代碼實現
有n=2^k個遠動員選手,設計比賽日程表實現:
(1)每個選手必須與n-1個選手比賽
(2)每個選手一天只比賽一場
(3)比賽共進行n-1天
輸入:n人
輸出:n行n-1列,第i行第j列表示第i個選手第j天遇到的對手,不包含第一列表示為選手編號
舉例:2人
? ? ?1 ? 2
? ? ?2 ? 1
2、問題分析
通過化大為小,分而治之的思想,將多人的比賽日程縮小為2人的日程。以此倒推所有人的日程。
注意多人日程規律:
以四人為例:
1 2 |?3 4
2 1 | 4 3
----------
3 4 |?1 2
4 3 | 2 1
這樣一個矩陣分為四個區,左上和右下一樣,左下和右上一樣,且右上是左上對應的數字加了n/2.
3、代碼實現
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 128 5 int matrix[N][N] = {0}; 6 7 void fun(int n) 8 { 9 int i; 10 int j; 11 if (n<=0) 12 { 13 return; 14 } 15 if (n>2) 16 { 17 fun(n/2); 18 for (i=1;i<=n/2;i++) 19 { 20 for (j=n/2+1;j<=n;j++) 21 { 22 matrix[i][j] = matrix[i][j-n/2] + n/2; 23 } 24 } 25 for (i=n/2+1;i<=n;i++) 26 { 27 for (j=1;j<=n/2;j++) 28 { 29 matrix[i][j] = matrix[i-n/2][j+n/2]; 30 } 31 } 32 for (i=n/2+1;i<=n;i++) 33 { 34 for (j=n/2+1;j<=n;j++) 35 { 36 matrix[i][j] = matrix[i-n/2][j-n/2]; 37 } 38 } 39 } 40 else 41 { 42 matrix[1][1] = 1; 43 matrix[1][2] = 2; 44 matrix[2][1] = 2; 45 matrix[2][2] = 1; 46 } 47 } 48 49 void main() 50 { 51 fun(8); 52 53 int i,j; 54 for (i=1;i<=8;i++) 55 { 56 for (j=1; j<=8; j++) 57 { 58 printf("%d ",matrix[i][j]); 59 } 60 printf("\n"); 61 } 62 }
http://blog.chinaunix.net/uid-26874207-id-4206383.html?utm_source=jiancool