问题描述

  设有有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

思路

  先修正一下题目的BUG,输出格式应该为<i>A-B C-D,而不是,,首先观察题目,任何两支队伍都只要比赛一场,所以选择一个map二维数组来记录是否队伍间的比赛情况,然后,观察每一行输出,1-n只出现过一次,所以此处定义一个一维数组来记录在这一次输出中,某一个队伍是否参加了比赛。AC代码如下。

AC代码

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,book[100],map[100][100];
void dfs()
{
    int k=0;
    memset(book,0,sizeof(book));
    while (1)
    {
        for (int i=1;i<=n;i++)
        {
            for (int j=i+1;j<=n;j++)
            {
                if (map[i][j]==0&&book[i]==0&&book[j]==0)
                {
                    k++;
                    book[i]=1;
                    book[j]=1;
                    map[i][j]=1;
                    cout<<i<<"-"<<j<<" ";
                }
                if (k==n/2)
                return ;
            }
        }
    }
}
int main()
{
    cin>>n;
    n=pow(2,n);
    m=n-1;
    for (int i=1;i<=m;i++)
    {
        cout<<"<"<<i<<">";
        dfs();
        if (i!=m)
        cout<<endl;
    }
}