https://www.acmicpc.net/problem/16509

상은 8가지 방향으로 이동할 수 있습니다. 각 이동은 다음 두 단계로 이루어집니다:
예를 들어, 상(위쪽)으로 한 칸 이동 후, 좌상향 대각선으로 두 칸 이동하는 식입니다.
상은 이동할 수 있는 경로가 여러 개 있으며, 최단 이동 횟수를 찾는 문제이므로 최단 경로 알고리즘인 BFS(Breadth-First Search) 를 사용하는 것이 적합합니다. BFS는 시작점에서부터 인접한 모든 노드를 탐색한 후, 다음 레벨로 넘어가면서 최단 경로를 보장하기 때문입니다.
deque를 사용하여 효율적인 큐 구현이 가능합니다.O(10 * 9) = O(90)의 공간을 사용합니다.O(90)입니다.총 공간 복잡도: O(1) (상수 공간)으로 간주할 수 있습니다.
O(8 * 90) = O(720)입니다.총 시간 복잡도: O(1) (상수 시간)으로 간주할 수 있습니다. 실제로는 장기판의 크기가 고정되어 있기 때문에 입력 크기에 관계없이 일정한 시간 내에 실행됩니다.
from collections import deque
input = __import__('sys').stdin.readline
# 16509 장군
arr = [[0] * 9 for _ in range(10)]
visit = [[0] * 9 for _ in range(10)]
dx, dy = [-3, -3, -2, -2, 2, 2, 3, 3], [-2, 2, -3, 3, -3, 3, -2, 2]
r, c = map(int, input().split())
a, b = map(int, input().split())
arr[a][b] = 1
# 움직일 수 있는지 확인하는 함수
def move(i, j, tp):
tx = [
[-1, -2],
[-1, -2],
[0, -1],
[0, -1],
[0, 1],
[0, 1],
[1, 2],
[1, 2]
]
ty = [
[0, -1],
[0, 1],
[-1, -2],
[1, 2],
[-1, -2],
[1, 2],
[0, -1],
[0, 1]
]
# 상의 이동경로에 왕이 존재하면 갈 수 없음: 0 반환
for k in range(2):
x, y = i + tx[tp][k], j + ty[tp][k]
if (x == a and y == b):
return 0
return 1
def bfs(i, j):
q = deque()
visit[i][j] = 1
q.append((i, j, 0))
while q:
i, j, c = q.popleft()
for k in range(8):
x, y = i + dx[k], j + dy[k]
if not(0 <= x < 10 and 0 <= y < 9): continue
if not move(i, j, k): continue # 이동 경로에 왕이 존재하면 continue
if visit[x][y]: continue
if x == a and y == b: return c + 1
visit[x][y] = 1
q.append((x, y, c + 1))
return -1
print(bfs(r, c))