#include<stdio.h>
#include<malloc.h>
//循环赛日程表
int t = 0;
//左上角的表格复制到右下角
void copy1(int **A,int i,int j,int n) {
for (int k = 0; k < n;k++) {
for (int x = 0; x < n;x++) {
//从左上角到右下角的变化:
//行变化:左上角的起始位置的行i+分成小的表格后每个表格所含数的个数n
//随着k的变化,行也会变化:i+n+k
//列变化:左上角的起始位置的列j+分成4个表格后每个表格所含数的个数n
//随着x的变化,列也会变化:j+n+x
A[n+i+k][n+j+x]= A[i+k][j+x];
}
}
}
//左下角的表格复制到右上角
void copy2(int** A, int i, int j, int n) {
for (int k = 0; k < n; k++) {
for (int x = 0; x < n; x++) {
//左下角到右上角的变化
//行变化:左下角的起始位置的行i-分成小的表格后所含数的个数n
//随着k的变化,行也会变化:i-n+k
//列变化:左下角的起始位置的列j+分成4个表格后每个表格所含数的个数n
//随着x的变化,列也会变化:j+n+x
A[i-n+k][n +j+ x]= A[i + k][j + x];
}
}
}
void table(int **A,int i,int j,int n) {
if (n>1) {
table(A,i,j,n/2);
table(A,i + n / 2, j, n / 2);
copy1(A,i,j,n/2);
copy2(A, i + n / 2, j, n / 2);
}
else {
A[i][j] = ++t;
}
}
//打印二维数组
void printfArr(int **A,int rows,int cols) {
for (int i = 0; i < rows;i++) {
for (int j = 0; j < cols;j++) {
printf("%d ",A[i][j]);
}
printf("\n");
}
}
int main() {
int rows,cols;
printf("请输入参赛人员数:");
scanf_s("%d",&rows);
int ** A = (int **)malloc(sizeof(int*) * rows);
cols = rows;
for (int i = 0; i < rows;i++) {
A[i] = (int *)malloc(sizeof(int) * cols);
}
table(A,0,0,rows);
printfArr(A,rows,cols);
for (int i = 0; i < rows;i++) {
free(A[i]);
}
free(A);
return 0;
}