#include<iostream>
using namespace std;
int a[100][100];
int n; //选手的个数
/*
tox:目标数组的行号
toy:目标数组的列号
fromx:源数组的行号
fromy:源数组的列号
r:数组的大小为 r*r
*/
void copy(int tox, int toy, int fromx, int fromy, int r)
{
for(int i = 0; i < r; i++)
for(int j = 0; j < r; j++)
a[tox+i][toy+j] = a[fromx+i][fromy+j];
}
void table(int k)
{
n = 1 << k;
//构造正方形表格的第一行数据
for(int i = 0; i < n; i++)
a[0][i] = i + 1;
//采用分治算法,构造整个循环赛日程表
for(int r = 1; r < n; r <<= 1)
for(int i = 0; i < n; i += 2*r)
{
copy(r, r + i, 0, i, r); //左上角复制到右下角
copy(r, i, 0, r + i, r); //右上角复制到左下角
}
}
int main()
{
int k;
cin>>k;
table(k);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cout<< a[i][j] << " ";
}
cout<<endl;
}
return 0;
}
/**************************************************************
Problem: 1377
User: admin
Language: C++
Result: Accepted
Time:9 ms
Memory:2116 kb
****************************************************************/