赛事日程表的编制

来源:百度知道 编辑:UC知道 时间:2024/06/05 18:28:47
设有n=2^k个运动员要进行网球循环赛,现要设计一个满足以下要求的比赛日程表:
1、每个选手必须与其他n-1个选手各赛一次
2、每个选手一天只能参赛一次
3、循环赛在n-1天内结束

程序设计要求:请按此要求将比赛日程表设计成有n行和n-1列的一个表,在表中的第i行,第j列处填入第i个选手第j天所遇到的对手

#include<iostream.h>
#include<iomanip.h>
#include<math.h>

void Table(double k, int **a) {
int i, j, s, t, n = pow(2, k);
for (i = 1; i <= n; i++) a[1][i] = i;
int m = 1;
for (s = 1; s <= k; s++) {
n /= 2;
for (t = 1; t <= n; t++)
for (i = m + 1; i <= 2 * m; i++)
for (j = m + 1; j <= 2 * m; j++) {
a[i][j+(t-1)*m*2] = a[i-m][j+(t-1)*m*2-m];
a[i][j+(t-1)*m*2-m] = a[i-m][j+(t-1)*m*2];
}
m *= 2;
}
}

print(int **a, int n) {
for(int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cout<<setw(3)<<a[i][j];
cout<<endl;
}
}

void main() {
cout<<" 输入人数: n = ";
int n;
cin>>n;
int **a = new int*[n+1];
for (int i = 0; i <= n; i++)
a[i] = new int[n+1];
int k = log10(n)/log10(2);
Table(k, a);
cout<