알고리즘/BOJ
[ 백준 / 파이썬 ] 7562. 나이트의 이동
감싹이
2023. 3. 23. 08:00
🎉 문제
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
🎉 풀이
✅ bfs 이용
✅ queue에 좌표, 이동횟수를 담아서 목적지에 도달할 때까지 돌렸음
✅ 최소 횟수 출력이기때문에 방문체크 해주면서 돌림
🎉 코드
from collections import deque
t = int(input()) #tc
for _ in range(t):
n = int(input()) #체스판 한 변의 길이
i, j = map(int, input().split()) #지금 위치
gi, gj = map(int, input().split()) #목적지
queue = deque()
queue.append([i, j, 0]) #큐에 지금 위치 추가
#나이트가 이동할 수 있는 8방향
di = [-2, -1, 1, 2, 2, 1, -1, -2]
dj = [1, 2, 2, 1, -1, -2, -2, -1]
#이미 다녀간 곳인지 아닌지 체크
visited = [[False]*n for _ in range(n)]
answer = 0
while queue:
#좌표, 이동횟수
a, b, cnt = queue.popleft()
#목표에 도달하면
if a == gi and b == gj:
#이동횟수를 답으로 갱신해주고 while문 break
answer = cnt
break
#8방향 탐색
for k in range(8):
ni = a + di[k]
nj = b + dj[k]
#탐색할 수 있는 좌표면서
if 0 <= ni < n and 0 <= nj < n:
#이전에 방문하지 않았다면
if not visited[ni][nj]:
#거기로 갈 거야~~
visited[ni][nj] = True
#큐에 좌표 추가, 1회 증가한 이동횟수 추가
queue.append([ni, nj, cnt+1])
#정답 출력
print(cnt)