码迷,mamicode.com
首页 > 其他好文 > 详细

循环赛日程表 分治法

时间:2015-08-10 00:19:37      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:分治

循环赛日程表 分治法


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

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


// 采用分治法

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


技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/core__code

循环赛日程表 分治法

标签:分治

原文地址:http://blog.csdn.net/core__code/article/details/47382385

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!