// snake matrix
#include <iostream>
#include <cstring>
using namespace std;
enum DIRECTION {DOWN, RIGHT, UP, LEFT};
int main ()
{
int *A ;
int n;
cin >> n;
A = new int [n*n];
memset (A, 0, n*n*sizeof (int));
DIRECTION dir = DOWN;
int k;
int row =0, col = 0;
for (k = 1; k <= n*n; k++) {
A[row*n+col] = k;
switch (dir) {
case DOWN:
if (row < n-1 && A[(row+1)*n+col] == 0) {
row ++;
} else {
dir = RIGHT;
col ++;
}
break;
case RIGHT:
if (col < n-1 && A[row*n+(col+1)] == 0) {
col ++;
} else {
dir = UP;
row --;
}
break;
case UP:
if (row > 0 && A[(row-1)*n+col] == 0) {
row --;
} else {
dir = LEFT;
col --;
}
break;
case LEFT:
if (col > 0 && A[row*n+col-1] == 0) {
col --;
} else {
dir = DOWN;
row ++;
}
break;
}
}
for (row = 0; row < n; row ++) {
for (col = 0; col < n; col ++) {
cout.width (4);
cout << A[row*n+col];
}
cout << endl;
}
delete [] A;
return 0;
}
