蓝桥杯 - 算法训练 比赛安排 C语言实现

    xiaoxiao2021-03-25  100

    算法训练 比赛安排 题目:(蓝桥杯测试有问题) 问题描述   设有有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

    最新回复(0)