说明
设有(n<=6)个球队进行单循环比赛,计划在
– 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在
– 1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
队 1 2 3 4
比赛 1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天
输入格式
每个测试文件只包含一组测试数据,每组输入数据为一个正整数n(n<=6)。
输出格式
对于每组输入数据,输出比赛安排,从第一天的安排开始,每天占一行,每行开头先输出天号,再输出当天的安排,优先给队伍编号小的队伍安排比赛,具体格式见样例输出。
样例
输入数据 1
2
输出数据 1
<1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3
思路及代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n, a[100], t[100][100];
//a[i] 用来标记第 i队当天是否比赛过,t[i][j] 用来标记 i队和 j 队是否比赛过
int num = 1, temp, tim;
int main()
{
cin >> n;
for(int i = 0; i < n; i++){
num *= 2;
}//校 oj上面识别不了 pow函数,所以这里用循环
temp = num - 1;
while(temp){
tim++;
cout << '<' << tim << '>';
int k = 0;
for(int i = 1; i <= num; i++){
if(a[i] == 0){
a[i] = 1;//标记已参赛
for(int j = i + 1; j <= num; j++){
if(t[i][j] == 0 && a[j] == 0){
cout << i << '-' << j;
a[j] = 1;//标记已参赛
t[i][j] = 1;//标记 i队与 j队比过
k++;
break;
}
}
if(k < num / 2) cout << ',';
//每天比 num / 2场比赛,所以前 num / 2场加‘,’即可
}
}
for(int i = 1; i <= num; i++) a[i] = 0;
//每天比完后将每个队比赛状态初始化为未比赛,及为 0
cout << endl;
temp--;
}
return 0;
}