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、代码实现
-
#include <stdio.h>
-
#include <string.h>
-
-
#define N 128
-
int matrix[N][N] = {0};
-
-
void fun(int n)
-
{
-
int i;
-
int j;
-
if (n<=0)
-
{
-
return;
-
}
-
if (n>2)
-
{
-
fun(n/2);
-
for (i=1;i<=n/2;i++)
-
{
-
for (j=n/2+1;j<=n;j++)
-
{
-
matrix[i][j] = matrix[i][j-n/2] + n/2;
-
}
-
}
-
for (i=n/2+1;i<=n;i++)
-
{
-
for (j=1;j<=n/2;j++)
-
{
-
matrix[i][j] = matrix[i-n/2][j+n/2];
-
}
-
}
-
for (i=n/2+1;i<=n;i++)
-
{
-
for (j=n/2+1;j<=n;j++)
-
{
-
matrix[i][j] = matrix[i-n/2][j-n/2];
-
}
-
}
-
}
-
else
-
{
-
matrix[1][1] = 1;
-
matrix[1][2] = 2;
-
matrix[2][1] = 2;
-
matrix[2][2] = 1;
-
}
-
}
-
-
void main()
-
{
-
fun(8);
-
-
int i,j;
-
for (i=1;i<=8;i++)
-
{
-
for (j=1; j<=8; j++)
-
{
-
printf("%d ",matrix[i][j]);
-
}
-
printf("\n");
-
}
-
}
阅读(6428) | 评论(1) | 转发(0) |