标签:分治
采用分治法, 逐步产生结果, 将 左上角的数字,拷贝到 右下角, 右上角的数字,拷贝到 左下角。
本程序以偶数计算,如果是奇数的话,那么就多增加一个,做轮空处理。
// 采用分治法
#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