循环赛日程表 分治法

来源:互联网 发布:ubuntu 挂载命令 编辑:程序博客网 时间:2024/04/29 10:01

循环赛日程表 分治法


采用分治法, 逐步产生结果, 将 左上角的数字,拷贝到 右下角, 右上角的数字,拷贝到 左下角。

本程序以偶数计算,如果是奇数的话,那么就多增加一个,做轮空处理。


// 采用分治法#include <iostream>#include <cstdio>using namespace std;const int M = 1<<10;int a[M][M];void getTable(int k)    // 2^k{    int n = 1<<k;    // init    for(int i=1; i<=n; ++i)        a[1][i] = i;    int m = 1;    for(int s=1; s<=k; ++s)     // 多少块    {        n /= 2;        for(int t=1; t<=n; ++t)     // 一行循环几次        {            for(int i=m+1; i<=2*m; ++i)            {                for(int j=m+1; j<=2*m; ++j)                {                    int p = j + (t-1)*2*m;  // (t-1)*2*m 是起始坐标                    a[i][p] = a[i-m][p-m];  // 左上角的数字,拷贝到 右下角                    a[i][p-m] = a[i-m][p];  // 右上角的数字,拷贝到 左下角                }            }        }        m *= 2;    }}void display(int k){    int n = 1<<k;    for(int i=1; i<=n; ++i)    {        for(int j=1; j<=n; ++j)        {            printf("%d  ", a[i][j]);        }        printf("\n");    }    printf("\n");}int main(void){    int k = 3;    getTable(k);d    display(k);    return 0;}



1 0
原创粉丝点击