比赛安排
说明
设有2n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2n – 1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
队
1 2 3 4
比赛
1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天
输入格式
每个测试文件只包含一组测试数据,每组输入数据为一个正整数n(n<=6)。
输出格式
对于每组输入数据,输出比赛安排,从第一天的安排开始,每天占一行,每行开头先输出天号,再输出当天的安排,优先给队伍编号小的队伍安排比赛,具体格式见样例输出。
样例
Sample Input 1
2
Sample Output 1
<1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3
思路详解:
1.本题数据范围不大,所以这里直接采用暴力枚举的方法
2.开两个数组用于记录训练过的队伍,判断过程中需注意外层循环输出的数与内层输出的数就行
3,一维数组用于判断每天训练的不同队伍排序,二维数组用于记录总的训练过的队伍排序
源码:
#include <bits/stdc++.h>
using namespace std;
int n;
int b[100][100] = {0};
int main() {
cin >> n;
int s = pow(2, n);//2^n
// cout << a[i] << " ";
int m = 1, n = s;
while (--s) {
int a[100] = {0};//记录训练过的队伍
cout << "<" << m++ << ">"; //序号输出
for (int i = 1; i <= n; i++) {
if (!a[i]) {//判断内层是否已训练
a[i] = 1;
// cout << a[i];
for (int j = i + 1; j <= n; j++) {
if (!a[j] && !b[i][j]) { //判断是否该队已经训练
if (i != 1) //判断是否位于输出第一位
cout << ",";
cout << i << "-" << j;
b[i][j] = 1;//标记第一天训练过的顺序
a[j] = 1; //标记该轮训练的队伍
break;
}
}
}
}
cout << endl;
}
return 0;
}
明天继续!!!```