问题描述
设有有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
本来刚开始是想用全排列做的,,,结果总是有问题出现,,,先附上代码,以后想再看的话看看能不能改正确
#include <iostream>
#include<cstdio>
#include <algorithm>
#include<cstring>
const int Max = 100;
using namespace std;
int a[Max], b[Max][Max];
int main()
{
int n, i=1, k, sum;
scanf("%d", &k);
n = 1 << k;
int s[n+5];
for(int i=1; i<=n; i++)
{
s[i-1] = i;
}
// cout << s << endl;
printf("<%d>", i++);
int j=0;
while(s[j])
printf("%d-%d ", s[j++], s[j++]);
printf("\n");
// for(int i=1; i<=n-1; )
do{
if(s[0] != 1)//后面比赛的也要标记下,目前这个没标记
break;
else
{
printf("<%d>", i++);
int i=0;
while (s[i])
printf("%d-%d ", s[i++], s[i++]);
}
printf("\n");
}while(next_permutation(s, s+n));
return 0;
}
#include <iostream>
#include<cstdio>
#include<cstring>
const int Max = 100;
using namespace std;
int a[Max], b[Max][Max];
int main()
{
int n, i, j, k, s, sum;
scanf("%d", &n);
s = 1<<n;
for(i=1; i<s; i++)
{
memset(a, 0, sizeof(a));
printf("<%d>", i);
sum = 0;
for(j=1; j<s; j++)
for(k=j+1; k<=s; k++)
//判断有没有比过赛
if(!a[j] && !a[k] && !b[j][k] && !b[k][j])
{
a[j] = 1;
a[k] = 1;
b[j][k] = 1;
b[k][j] = 1;
sum++;
printf("%d-%d", j, k);
if(sum < (s>>1))
printf(" ");
}
printf("\n");
}
return 0;
}