循环赛日程表

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值