试题 算法训练 比赛安排
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛。
输入格式
输入文件matchplan.in共一行,输入n的数值。
输出格式
输出文件matchplan.out共(2 n – 1)行,第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>
#include<string.h>
#include<math.h>
int main(){
int a[65][65],b[65],i,j,k,l,n,m; //数组定义大了可以防止数据溢出
scanf("%d",&n);
m=pow(2,n);
memset(a,0,sizeof(a));
for(i=1;i<=m-1;i++){
printf("<%d>",i);
memset(b,0,sizeof(b));
for(j=1;j<=m/2;j++){
for(k=1;k<=m;k++){
int s=1;
if(b[k]==1){
continue;
}
else{
b[k]=1;
}
for(l=1;l<=m;l++){
if(b[l]==1){
continue;
}
else{
if(a[k][l]!=1 && b[l]!=1){
printf("%d-%d ",k,l);
a[k][l]=1;
b[l]=1;
s++;
break;
}
}
}
if(s==2){
s=1;
break;
}
}
}
printf("\n");
}
return 0;
}