问题描述
设有有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;
}
}