#include <stdio.h>
int main()
{
void sort(int n,int m,int a[][500]);
int n1,n,i,j;
int a[500][500];//定义一个数组
scanf("%d",&n);//输入n,则规模的大小为2的n次方
for(i=0,n1=1;i<n;i++)
n1=n1*2;//n1为规模的大小
for(i=0;i<n1;i++)
a[i][0]=i+1;
sort(n1,0,a);//安排函数
for(i=0;i<n1;i++)
{
for(j=0;j<n1-1;j++)
printf("%d ",a[i][j]);//输出安排的结果
printf("%d",a[i][j]);
printf("\n");
}
return 1;
}
void sort(int n,int m,int a[][500])//运用分治的方法,用递归来实现子问题的解决
{
int i,j;
if(n==2)//递归结束条件
{
a[m+n/2][n/2]=a[m][0];
a[m][n/2]=a[m+n/2][0];
}
else
{
sort(n/2,m,a);//递归调用
for(i=m+n/2;i<m+n;i++)
for(j=n/2;j<n;j++)
a[i][j]=a[i-n/2][j-n/2];
sort(n/2,m+n/2,a);//递归调用
for(i=m;i<m+n/2;i++)
for(j=n/2;j<n;j++)
a[i][j]=a[i+n/2][j-n/2];
}
}