t = int(input())
for i in range(1, t + 1):
n = int(input())
arr = [[0] * n for _ in range(n)]
def reverse(array):
array = array[::-1]
array = list(map(list, zip(*array)))
return array
cnt = 1
a = 0
while cnt != n * n + 1: # 90 도 회전
for t in range(a, n):
if not arr[a][t]:
arr[a][t] = cnt
cnt += 1
if cnt == (4 * n - 3):
a += 1
for _ in range(3):
arr = reverse(arr)
while arr[0][0] != 1:
arr = reverse(arr)
print(f"#{i}")
for a in arr:
print(*a)
우 -> 하 -> 좌 -> 상
순으로 이동한다.
제일 처음 오른쪽 방향으로 이동을 3번이라고 생각하면, 3 -> 2 -> 2 -> 1 -> 1 순으로 루프를 돌 수 있다.
만약 N = 4라면, 4 -> 3 -> 3 -> 2 -> 2 -> 1 -> 1 순으로 루프를 돌 수 있다.
T = int(input())
for k in range(1, T + 1):
N = int(input())
# i, j를 증가를 저장할 리스트
di = []
dj = []
for n in range(N, 0, -1):
for _ in range(n): # 1) N = 3이라면 먼저 n인 3번 오른쪽인 [0, 1]을 추가
di.append(0)
if (N - n) % 2 == 0:
dj.append(1)
else: # 3) 3번째 이동방향은 왼쪽이므로, 홀수이면 [0, -1]을 2번 추가
dj.append(-1)
for _ in range(n - 1): # 2) 그 다음 2번 아래로 [1, 0]을 추가
di.append(1 - (2 * ((N - n) % 2))) # 4) [-1, 0]을 1번 추가
dj.append(0)
# 2차원 배열 초기화 : NxN
arr = [[0] * N for _ in range(N)]
i = j = 0
for n in range(1, N * N + 1):
if n == 1: # 첫번째 값 arr[0][0] = 1
arr[i][j] = 1
else:
i += di[n - 1]
j += dj[n - 1]
arr[i][j] = n
print(f"#{k}")
for list in arr:
print(*list)