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