풀이


체스판 위의 나이트가 일정 지점에서 목표 지점으로 이동하는 최소한의 이동횟수를 구하는 문제이다.

나이트의 이동경로방향을 dx, dy 를 통해 선언해준 뒤 입력조건에 맞춰 BFS 를 실행한다.

나이트가 이동할 때 마다 방문처리를 해주면서 몇 번째 이동으로 인해 방문했는지 2차원 배열 board 에 저장한 뒤,

목표 지점에 도달했을 때의 값을 반환해주면된다.

소스코드


# 나이트의 이동
from collections import deque
import sys
input = sys.stdin.readline
 
def bfs(i, j):
    q = deque()
    q.append([i, j])
    board[i][j] = 1  # 시작 점 방문처리
    while q:
        x, y = q.popleft()
        if x == c and y == d:
            return board[x][y] - 1
        for k in range(8):
            nx = x + dx[k]
            ny = y + dy[k]
            if 0 <= nx < l and 0 <= ny < l and board[nx][ny] == 0:  # 범위 내 이면서 방문하지 않았을 경우
                board[nx][ny] = board[x][y] + 1  # 방문 처리 겸 초 계산
                q.append([nx, ny])
 
dx = [-1, -2, -2, -1, 1, 2, 2, 1]
dy = [-2, -1, 1, 2, 2, 1, -1, -2]
 
for t in range(int(input())):
    l = int(input())
    board = [[0] * l for _ in range(l)]
    a, b = map(int, input().split())
    c, d = map(int, input().split())
    print(bfs(a, b))

References