算法训练 比赛安排
题目:(蓝桥杯测试有问题)
问题描述
设有有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
分析:
首先说一下蓝桥杯的测试数据每场比赛是用空格隔开,上面给出的样式是错误的。说一下题目,数据规模不大,除非一开始有思路(找到其中的规律)不然直接暴力,跌for吧。
代码在此:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define SIZE 1 << 6
int main () {
int n;
int a[SIZE+1][SIZE+1]; //下标从1开始,记录队伍一和队伍二是否已经比赛
int v[SIZE+1]; // 下标从1开始,记录某队伍该天已经比赛
int i,j,k,h;
int len;
scanf("%d", &n);
memset(a,0,sizeof(a));
len = (int)pow(2,n); //队伍数2^n
for(i = 0; i < len-1; i ++){ //天数 2^n-1
printf("<%d>",i+1);
memset(v,0,sizeof(v)); //重置(该天每个队伍都没被访问)
for(j = 0; j < len/2; j ++){ //每天n场
for(k = 1; k <= len; k ++){ //队伍一
if(v[k] == 1) //该天该队伍是否已经比赛
continue;
int judge = 0; //判断k,h这两对如果比赛就跳出,今天不再会有他们的比赛
for(h = 1; h <= len; h ++){ //队伍一二
if(k == h) //队伍一等于队伍二跳出
continue;
if(v[h] == 1) //该天该队伍是否已经比赛
continue;
if(a[k][h] == 0 && a[h][k] == 0){ //h,k两队伍该天是否有一起比赛
printf("%d-%d ", k, h);
v[h] = 1; //标记h队伍今天不再比赛比赛
v[k] = 1; //标记k队伍今天不再比赛比赛
a[k][h] = 1; //标记h和k今天已经比赛
judge = 1; //标记第j场结束,跳到下一场
break;
}
}
if(judge == 1) //第j场结束,跳到下一场
break;
}
/* if(j != len/2-1)
printf(","); */
} //多少场 (尾部)
printf("\n");
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-10582.html