문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
풀이과정
나이트가 이동할 수 있는 8칸을 dx, dy를 통해 나타내었다. bfs를 활용하여 방문하지 않은 노드에는 이전 노드의 값에 1을 더해줌으로써 해당 노드까지 가는데 움직인 칸 수를 나타내었다.
소스코드
import sys
input = sys.stdin
# 나이트가 이동할 수 있는 칸
dx = [-2,-2,-1,-1,1,1,2,2]
dy = [-1,1,-2,2,-2,2,-1,1]
def bfs(start, end, visit, l):
q = [(start[0], start[1])]
cnt = 0
while q:
x, y = q.pop(0)
if [x, y] == end:
break
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < l and 0 <= ny < l and not visit[nx][ny]:
visit[nx][ny] = visit[x][y] + 1
q.append((nx, ny))
t = int(input.readline().strip())
for _ in range(t):
l = int(input.readline().strip())
start = list(map(int,input.readline().split()))
end = list(map(int,input.readline().split()))
if start == end:
print(0)
continue
visit = [[0] * l for _ in range(l)]
visit[start[0]][start[1]] = 1
bfs(start, end, visit, l)
print(visit[end[0]][end[1]] - 1)