Picture0
Picture1
Picture2
Picture3
#include<iostream>
#include<cmath>
#define MAXN 10000
using namespace std;
int n;
int a[MAXN][MAXN];
void setTable(int t,int length);
void fillTable(int t,int length);//对角填充,左上填右下,左下填右上
void output(int length);
int main()
{
int i,length=1;
cin>>n;
length=pow(2,n);
for(i=1;i<=length;i++)a[i][1]=i;
setTable(1,length);
output(length);
return 0;
}
void setTable(int t,int length)
{
int i,len;
if(length==2){
a[t+1][2]=a[t][1];
a[t][2]=a[t+1][1];
}
else{
len=length/2;
setTable(t,len);
setTable(t+len,len);
fillTable(t,length);
}
}
void fillTable(int t,int length)
{
int i,len,j;
len=length/2;
for(i=t;i<t+len;i++){//左上填充右下
for(j=1;j<=len;j++)
a[i+len][j+len]=a[i][j];
}
for(i=t+len;i<t+2*len;i++){//左下填充右上
for(j=1;j<=len;j++)
a[i-len][j+len]=a[i][j];
}
}
void output(int length)
{
int i,j;
for(i=1;i<=length;i++){
for(j=1;j<=length;j++){
cout<<a[i][j];
if(j!=length)cout<<" ";
}
cout<<endl;
}
}