upstreamL

博客中的文章用于做笔记用,来源于网络,并非本人所写,如有侵权,请您联系我标明出处或删除,3Q~

导航

分治法——循环赛日程表

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、代码实现
 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

 

posted on 2017-03-06 09:17  upstreamL  阅读(566)  评论(0编辑  收藏  举报