题干:2^k个球员进行网球循环赛,需要设计比赛日程表。比赛共进行n-1天。每个选手一天只能赛一次,每个选手必须与其他选手各赛一次。
解决:非常简单的一道递归问题。
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 5000;
int k;
int map[maxn][maxn];
void com(int len) {
if (len == 0) {
return;
}
com(len / 2);
for (int i = 1; i <= len; i++) {
for (int j = len + 1; j <= 2 * len; j++) {
map[i][j] = map[i][j - len] + len;
}
}
for (int i = 1 + len; i <= 2 * len; i++) {
for (int j = 1; j <= len; j++) {
map[i][j] = map[j][i];
}
}
for (int i = 1 + len; i <= 2 * len; i++) {
for (int j = 1 + len; j <= 2 * len; j++) {
map[i][j] = map[i - len][j - len];
}
}
}
int main()
{
map[1][1] = 1;
cin >> k;
com(pow(2, k - 1));
for (int i = 1; i <= pow(2, k); i++) {
for (int j = 1; j <= pow(2, k); j++) {
cout << map[i][j] << " ";
}
cout << endl;
}
return 0;
}