#include #include 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; }