#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define N 20
int t[N][N];
void table(int k) //k为单循环赛日程表的级数,即日程表大小为2^k * 2^k
{ //将日程表保存在t[][]中
int m = 1; //刚开始块的规模
int n = 1; //n=2^k, 日程表的规模
int i, j;
for(i=1; i<=k; i++)
n *= 2;
for(i=1; i<=n; i++)
t[1][i] = i; //日程表第一行
int s, c;
for(s=1; s<=k; s++) //级数
{
n /= 2; //每一级数下的的块数,级数越小,块数越多
for(c=0; c<n; c++)
//每一块中需要填充的坐标数,块越小,需要填充的坐标数越少
for(i=m+1; i<=2*m; i++)
for(j=m+1; j<=2*m; j++)
{
t[i][j+c*m*2] = t[i-m][j+c*m*2-m]; //将块中左上角的数抄到右下角
t[i][j+c*m*2-m] = t[i-m][j+c*m*2]; //将块中右上角的数抄到左下角
}
m *= 2; //块的规模增大
}
}
int main()
{
int n;
printf("输入日程表级数:");
scanf("%d", &n);
table(n);
int i, j;
int len = pow(2, n);
for(i=1; i<=len; i++)
{
for(j=1; j<=len; j++)
printf("%d ", t[i][j]);
printf("\n");
}
return 0;
}
循环赛日程表
最新推荐文章于 2021-02-10 08:39:22 发布