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