1.用a[]数组来判断每个队伍当天是否比赛过
2.用b[][]数组来判断两个队伍当天是否比赛过(单循环)
3.共三重循环
4.第一重从第一天枚举到第pow(2,n)-1天
5.第二重循环从第一支球队枚举到第pow(2,n)支球队
6.第三重用于向后寻找相匹配的球队(当天未比赛且未和这支球队比赛过)
7.每天将所有球队的比赛次数设置为0,即a[]=0;
8.若第i支球队和第j支球队比赛过了则b[i][j]=1;
#include <bits/stdc++.h>
using namespace std;
int a[105], b[105][105];
int main() {
int n;
cin >> n;
for (int i = 1; i <= pow(2, n) - 1; i++) {
printf("<%d>", i);
memset(a, 0, sizeof(a));
//每天将a数组清零
for (int j = 1; j <= pow(2, n); j++) {
if (!a[j]) {
a[j] = 1;
for (int k = j + 1; k <= pow(2, n); k++) {
//向后寻找与之相匹配的球队
if (!a[k] && !b[j][k]) {
//当天k球队未比赛过,且两只球队未进行过比赛(单循环)
if (j != 1)
cout << ',';
printf("%d-%d", j, k);
a[k] = 1;
b[j][k] = 1;
//将其设置为1
break;
}
}
}
}
cout << endl;
//当天的比赛列举完则换行
}
return 0;
}