61 lines
1.9 KiB
C
61 lines
1.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
void table(int k, int **a, int n);
|
|
void printTable(int **array, int n);
|
|
|
|
void table(int k, int **a, int n) {
|
|
// 设置日程表第一行
|
|
for (int i = 0; i < n; i++) {
|
|
a[i][0] = i + 1; // 第一列设置为选手序号
|
|
}
|
|
// 填充表格
|
|
for (int s = 0; s < k; s++) {
|
|
int half = 1 << s; // 2^s
|
|
for (int t = 0; t < (1 << (k - s - 1)); t++) { // 2^(k-s-1)
|
|
for (int i = 0; i < half; i++) {
|
|
for (int j = 0; j < half; j++) {
|
|
a[i + half * t][j + half * t] = a[i][j];
|
|
a[i + half * t][j + half * t + half] = a[i][j + half];
|
|
a[i + half * t + half][j + half * t] = a[i + half][j];
|
|
a[i + half * t + half][j + half * t + half] = a[i + half][j + half];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void printTable(int **array, int n) {
|
|
// 打印表头
|
|
printf("选手 | ");
|
|
for (int j = 1; j < n; j++) { printf("第%d天 | ", j); }
|
|
printf("\n");
|
|
// 打印分隔行
|
|
for (int j = 0; j <= n; j++) { printf("-----"); }
|
|
printf("\n");
|
|
for (int i = 0; i < n; i++) {
|
|
printf("%2d | ", array[i][0]); // 打印选手序号
|
|
for (int j = 1; j < n; j++) { printf("%2d | ", array[i][j]); }
|
|
printf("\n");
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
int k = 3; // 2^3 = 8个运动员
|
|
int n = 1 << k; // 计算2^k
|
|
// 创建二维数组作为日程表
|
|
int **array = (int **)malloc(n * sizeof(int *));
|
|
for (int i = 0; i < n; i++) {
|
|
array[i] = (int *)malloc(n * sizeof(int));
|
|
for (int j = 0; j < n; j++) { // 确保初始化
|
|
array[i][j] = 0;
|
|
}
|
|
}
|
|
table(k, array, n);// 制作日程表
|
|
printTable(array, n);// 输出日程表
|
|
// 释放动态分配的内存
|
|
for (int i = 0; i < n; i++) { free(array[i]); }
|
|
free(array);
|
|
return 0;
|
|
}
|