蓝桥杯 比赛安排 (深搜) -----------------------C语言

举报
Fivecc 发表于 2022/08/06 01:09:55 2022/08/06
1.2k+ 0 1
【摘要】 /*问题描述   设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成, 每个队每天进行一场比赛。设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛。 输...

/*问题描述
  设有有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>
int b[30][30]={0};//标记曾经匹配过 
int dq[30]={0};//当天匹配标记 
int a[30];//被匹配者  (小组队伍红方) 
int a1[30];//匹配者 (小组队伍蓝方) 
int tw; //比赛小组队伍 (10支队伍 5队小组队伍) 
int T=0;//判断当前天数比赛 第一顺序方案是否已制定 
void f(int pos )
{int i,j,bt;//当前被匹配者 用于清除标记 

if(tw<pos)//pos 代表当前选第几组的比赛 
    {

        printf("<%d>",a1[1]-1);T=a1[1];//当前天数第一顺序计划已定 
       for(i=1;i<=tw;i++)
        {printf("%d-%d ",a[i],a1[i]);//输出匹配小组队伍 

         b[a[i]][a1[i]]=1; b[a1[i]][a[i]]=1;//相互标记为曾经匹配 
        }
          printf("\n");

    }
    else
    { for(i=1;i<=2*tw;i++)
        if(dq[i]==0){a[pos]=i;dq[i]=1;bt=i;break;} //按顺序拿出被匹配着; 
        for(i=1;i<=2*tw;i++)//匹配者循环 
         if( b[a[pos]][i]==0&&dq[i]==0)//判断曾经是否匹配过并且当前是否被匹配 
         {a1[pos]=i;dq[i]=1;
         f(pos+1);//试执行下一组比赛; 
           dq[i]=0;//清除当前匹配者
         if(T==a1[1]){i=2*tw;} //若当天第一顺序方案已确定则无需重复设计方案 
         }

         dq[bt]=0;//清除当前被匹配者 
    }
}

int main()
{
int n,i,j;
scanf("%d",&n);
tw=n;//小组队伍组数 
n=n*2-1;
for(i=1;i<=n;i++)//循环天数; 
     f(1);//从第一组队伍开始 

return 0;
}
  
 

文章来源: fivecc.blog.csdn.net,作者:Five-菜鸟级,版权归原作者所有,如需转载,请联系作者。

原文链接:fivecc.blog.csdn.net/article/details/79756453

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。