您的位置:首页 > 编程语言 > C语言/C++

算法训练 比赛安排

2016-02-16 15:39 302 查看
问题描述

  设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛。

输入格式

  输入文件matchplan.in共一行,输入n的数值。

输出格式

  输出文件matchplan.out共(2 n – 1)行,第i行输出第i天的比赛安排。

  格式为:<i> A-B,C-D,……。其中i是天数,A,B分别为比赛双方的编号,每行共2 n-1个比赛场次。

样例输入

2

样例输出

<1>1-2,3-4

<2>1-3,2-4

<3>1-4,2-3
#include <stdio.h>
#define MAXSIZE 64

int a[MAXSIZE][MAXSIZE];

void Div(int s, int left, int right)
{
if(s < 2){
return;
}

int i, j;
int mid = (left + right) / 2;

s /= 2;
Div(s, left, mid);
Div(s, mid+1, right);

for(i = 0; i <= s; i ++){
for(j = left; j <= mid; j ++){
a[i+s][j+s] = a[i][j];
}
for(j = mid+1; j <= right; j ++){
a[i+s][j-s] = a[i][j];
}
}

}

int main()
{
int i, j, n, size;

scanf("%d", &n);

size = 1;
for(i = 0; i < n; i ++){
size *= 2;
}

for(i = 1; i <= size; i ++){
a[0][i] = i;
}

Div(size, 1, size);

for(i = 1; i < size; i ++){
printf("<%d>", i);
for(j = 1; j <= size; j ++){
if(a[i][j] > j){
printf("%d-%d ", j, a[i][j]);
}
}
printf("\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c语言 分治