这个同样是算法课的作业,利用分治的思想,这个书上还是很简单,并且有模板,
#include <iostream>
using namespace std;
const int N=1000;
int array[N][N];
void table(int k,int array[][N])//数组下标从1开始
{
int i,j,s,t;
int n=1;
for(i=1;i<=k;i++)
n*=2; //求总人数
for(i=1;i<=n;i++)
array[1][i]=i; //第一行排1-8
int m=1; //用来控制每一次填表时i行j列的起始填充位置
for(s=1;s<=k;s++) //s指对称赋值的总循环次数,即分成几大步进行制作日程表
{
n=n/2;
for(t=1;t<=n;t++) //t指明内部对称赋值的循环次数
for(i=m+1;i<=2*m;i++)
for(j=m+1;j<=2*m;j++)
{
array[i][j+(t-1)*m*2]=array[i-m][j+(t-1)*m*2-m]; //右上角等于左上角的值
array[i][j+(t-1)*m*2-m]=array[i-m][j+(t-1)*m*2]; //左下角等于右上角的值
}
m*=2;
}
}
int main()
{
int k;
while(cin>>k)
{
table(k,array);
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
cout<<array[i][j]<<" ";
cout<<endl;
}
}
return 0;
}