算法训练 比赛安排

问题描述
  设有有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值