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(" "); 61 } 62 }
http://blog.chinaunix.net/uid-26874207-id-4206383.html?utm_source=jiancool