import java.util.Scanner;
public class Solution{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tc = sc.nextInt();
for (int t = 1; t <= tc; t++) {
int n = sc.nextInt();
int[][] map = new int[n][n];
int cur = 1;
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
// 홀수일 때, n / 2 바퀴 돌고 마지막 한개(n % 2) 채움
int x = 0, y = 0;
// 4방향을 모두 돌았을 때 전체 한바퀴이며
// 한 방향은 n-1개만큼 진행한다.
for (int k = 0; k < n / 2; k++) {
for (int dir = 0; dir < 4; dir++) { // 4방향
for (int unit = 0; unit < n - 1 - (k * 2); unit++) {// 한방향 진행 개수
map[x][y] = cur++;
x += dx[dir];
y += dy[dir];
}
} // 한바퀴를 다 돌았으면.. 바퀴 시작점으로 갔을테니까
// x+1, y+1로 가야되고
// 한방향 개수도 -2 줄어야함.
x += 1;
y += 1;
}
// 홀수일때 마지막 한개를 맵의 한가운데에 넣는다.
// 바퀴 돌고 나서 각각 +1 해주고 끝났으니까 그대로 넣는다
if(n % 2 == 1) {
map[x][y] = cur;
}
// 짝수일 때, n / 2바퀴 돌고 끝임.
System.out.println("#" + t);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
}
전체 몇바퀴 도는지, 한 바퀴 안의 한 방향이 몇 칸 진행되는지를 n과 연결지어 생각한다. 해당 칸이 진행되면 방향을 바꿔서 총 4방향이 필요하다.
예를 들어 n이 3일 때, 한 방향씩 2칸을 진행하며 그 후에 방향을 바꿔서 진행한다. 근데 배열에 원소 삽입할 때, 방향을 바꾸기 전 방향으로 먼저 삽입하기 때문에 반복문이 끝나고 나면 위치는 해당 바퀴가 돌았던 시작 위치로 가게 된다.
그래서 반복문이 끝나면 x, y에 각각 1을 더 해줌으로써 안쪽 위치로 가게 된다. 또한 한 방향의 진행(unit)은 -2만큼씩 더 줄어들게 된다.