#include <iostream>
using namespace std;
void DisplayMatrix (int A [100][100], int n);
int main()
{
int A [100][100] = {0};
int n;
cin >> n;
enum DIRECTION {DOWN = 0, LEFT, UP, RIGHT} dir = DOWN;//枚举
int row, col, k;
row = 0; col = n - 1;
for ( k = 1; k <= n*n; k++) {
A [row][col] = k;
switch (dir) {
case DOWN :
if (row < n-1 && A [row+1][col] == 0) {
++row;
} else {
--col; dir = LEFT;
}
break;
case LEFT :
if (col > 0 && A [row][col-1] == 0) {
--col;
} else {
--row; dir = UP;
}
break;
case UP :
if (row > 0 && A [row-1][col] == 0) {
--row;
} else {
++col; dir = RIGHT;
}
break;
case RIGHT :
if (col < n-1 && A [row][col+1] == 0) {
++col;
} else {
++row; dir = DOWN;
}
break;
}
}
DisplayMatrix (A, n);
}
void DisplayMatrix (int A [100][100], int n)
{
for (int row =0; row < n; ++row) {
for (int col = 0; col < n; ++col) {
cout.width (4);
cout << A [row][col];
}
cout << endl;
}
}
using namespace std;
void DisplayMatrix (int A [100][100], int n);
int main()
{
int A [100][100] = {0};
int n;
cin >> n;
enum DIRECTION {DOWN = 0, LEFT, UP, RIGHT} dir = DOWN;//枚举
int row, col, k;
row = 0; col = n - 1;
for ( k = 1; k <= n*n; k++) {
A [row][col] = k;
switch (dir) {
case DOWN :
if (row < n-1 && A [row+1][col] == 0) {
++row;
} else {
--col; dir = LEFT;
}
break;
case LEFT :
if (col > 0 && A [row][col-1] == 0) {
--col;
} else {
--row; dir = UP;
}
break;
case UP :
if (row > 0 && A [row-1][col] == 0) {
--row;
} else {
++col; dir = RIGHT;
}
break;
case RIGHT :
if (col < n-1 && A [row][col+1] == 0) {
++col;
} else {
++row; dir = DOWN;
}
break;
}
}
DisplayMatrix (A, n);
}
void DisplayMatrix (int A [100][100], int n)
{
for (int row =0; row < n; ++row) {
for (int col = 0; col < n; ++col) {
cout.width (4);
cout << A [row][col];
}
cout << endl;
}
}