样例
输入数据 1
2
输出数据 1
<1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3
分析:
1、每个选手必须与其它pow(2,n)-1名选手各比一次
2、每个选手一天只能比一次
如此,我们可以设计一个pow2,n)行pow(2,n)-1列的二维数组,用来表示i选手j天的对手,采用分治的方法来解决这个问题 。
完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int n, k = 1;
bool st[110][110];
int main() {
cin >> n;
for (int i = 1; i < pow(2, n); i++) {
bool a[110] = {false}; // 重新标记
cout << '<' << k++ << '>';
for (int j = 1; j <= pow(2, n); j++) { // 逐个遍历
if (a[j] == false) {
a[j] = true; // 标记遍历过的点
for (int p = 1; p <= pow(2, n); p++)
if (!a[p] && !st[j][p]) {
if (j != 1)
cout << ',';
cout << j << '-' << p;
st[j][p] = true;
a[p] = true;
break;
}
}
}
cout << endl;
}
return 0;
}