직선으로만 이동해야해서 '옆으로 가는 경우'와 '아래로만 가는 경우'로 구분하였다.
import sys
from collections import deque
sys.stdin = open("input.txt", "r")
for i in range(1, 11):
n = int(input())
arr = [list(input()) for _ in range(8)]
cnt = 0
queue = deque()
def rotation(x, y, k1, k2):
global sen, cnt
queue.append([x, y])
while queue:
a, b = queue.popleft()
sen += arr[a][b] # 문자열 생성
dx, dy = a + k1, b + k2
if len(sen) == n: # 문자열 sen이 길이 n과 같아질 경우
if sen == sen[::-1]: # 문자열 sen이 회문일 경우, cnt + 1
cnt += 1
return
if 0 <= dx < 8 and 0 <= dy < 8:
queue.append([dx, dy])
for j in range(8):
for k in range(8):
sen = ""
rotation(j, k, 0, 1) # 오른쪽 옆으로 가는 경우
for j in range(8):
for k in range(8):
sen = ""
rotation(j, k, 1, 0) # 아래로 가는 경우
print(f"#{i} {cnt}")
for i in range(10):
N = int(input())
List = list(input() for _ in range(8))
ans = 0
# 가로 확인
for y in range(8):
for x in range(8-N+1): # 가로 길이 8 - N + 1까지만 확인
A = List[y][x:x+N]
if A == A[::-1]:
ans += 1
# 세로 확인
for y in range(8-N+1): # 세로 길이 8 - N + 1까지만 확인
for x in range(8):
A = ''
for z in range(N): # 세로 길이를 N만큼만 확인
A += List[y+z][x]
if A == A[::-1]:
ans += 1
print("#{} {}".format(i+1, ans))