#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>

	int find_digits(int num) {
		char buf[128];
		sprintf(buf, "%d", num * num);
		return strlen(buf);
	}

	void print(int num, int m[num][num]) {
		unsigned int i, j;
		int padding = find_digits(num);
		for (i = 0; i < num; i++) {
			for (j = 0; j < num; j++)
				printf("%*d ", padding, m[j][i]);
			printf("\n");
		}
	}

	void spiral(unsigned int num) {
		unsigned int top_num = num * num;
		unsigned int current_num = 1;
		unsigned int i, j, dir = 0, times = 0;
		int curX = 0, curY = 0;

		int matrix[num][num];
		for (i = 0; i < num; i++)
			for (j = 0; j < num; j++)
				matrix[i][j] = 0;

		// 0 = right
		// 1 = down
		// 2 = left
		// 3 = up

		while (current_num <= top_num) {
			matrix[curX][curY] = current_num;
			current_num++;
			
			switch (dir) {
				case 0:
					curX++;
					break;
				case 1:
					curY++;
					break;
				case 2:
					curX--;
					break;
				case 3:
					curY--;
					break;
				default:
					fprintf(stderr, "error\n");
					break;
			}

			if (curX >= num - times && dir == 0) {
				curX--;
				curY++;
				dir = 1;
			} else if ((curX < 0 && dir == 2) || (times > 0 && (curX < times && dir == 2))) {
				curX++;
				curY--;
				dir = 3;
			} else if (curY >= num - times && dir == 1) {
				curY--;
				curX--;
				dir = 2;
			} else if ((curY < 0 && dir == 3) || (times > 0 && (curY < times && dir == 3))) {
				curY++;
				curX++;
				dir = 0;
			}

			if (matrix[curX][curY] != 0) {
				if (curX == curY && dir == 3) {
					times++;
					curX++;
					curY++;
					dir = 0;
				} else {
					break;
				}
			}
			
		}
		print(num, matrix);
	}

	int main(void) {
		unsigned int num;
		while (fscanf(stdin, "%d", &num) == 1) {
			if (num < 1) {
				fprintf(stderr, "please enter a number greater than 0 (you entered %d)\n", num);
				continue;
			}
			spiral(num);
		}
		return EXIT_SUCCESS;
	}