参考:单循环赛制:http://blog.sina.com.cn/s/blog_7800b1590101221s.html
下面的代码。。很难看,丑的快掉渣了,看了眼睛会流血。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
using namespace std;
const int maxn = 100;
struct node{
int x, y;
node(int _x=0, int _y=0) {
x = _x;
y = _y;
};
}a[maxn][maxn];
void Print(int r, int c) {
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++)
cout << setw(2)<< a[i][j].x << "-" << setw(2) << a[i][j].y;
cout << endl;
}
}
void Print2(int r, int c) {
int cas = 0;
for(int i = c-1; i >= 0; i--) { //列
cout << "<"<< ++cas <<">" ;
for(int j = 0; j < r; j++) { //行
int minn = min(a[j][i].x, a[j][i].y);
int maxn = max(a[j][i].x, a[j][i].y);
cout << minn << "-" << maxn << " ";
}
cout << endl;
}
}
int main() {
int n;
cin >> n;
// 一共会举行的天数:队数-(队数+1)%2; 这个就是判断奇数偶数
//一共会举行的场数:队数*(队数-1)/2;
//一共有2^n个队伍
int c = (int)pow(2,n)-((int)pow(2,n)+1)%2; //这里其实可以直接2^n-1的, 因为2^n必然是偶数!
//我用 固定轮转编排法: 打个表
int r = (int)pow(2,n)/2;
int x = 0;
for(int i = 0; i < r; i++)
a[i][0] = node(++x, (int)pow(2,n)-x);
for(int j = 1; j < c; j++) {
for(int i = 0; i < r-1; i++) {
a[i][j].y = a[i+1][j-1].y;
}
a[r-1][j].y = a[r-1][j-1].x;
for(int i = r-1; i ; i--)
a[i][j].x = a[i-1][j-1].x;
a[1][j].x = a[0][j-1].y;
a[0][j].x = 1;
}
//Print(r, c);
Print2(r, c);
return 0;
}