Algorithm/Baekjoon

[백준]7562번 나이트의 이동 파이썬 python

rrojin 2022. 1. 13. 15:32

문제 링크

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

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import sys
from collections import deque
 
input = sys.stdin.readline
 
dx = [-2,-1,1,2,2,1,-1,-2]
dy = [1,2,2,1,-1,-2,-2,-1]
 
= int(input())
 
def bfs(l, a,b,c,d):
    map = [[-1* l for _ in range(l)]
    map[a][b] = 0
    dq = deque()
    dq.append((a,b))
    while dq:
        x,y = dq.popleft()
        if x == c and y == d: #나이트가 이동하려는 칸과 일치 (도착)
            break
        for i in range(8): #나이트가 한번에 이동할 수 있는 step
            nx = x+dx[i]
            ny = y+dy[i]
            if 0<=nx<and 0<=ny<and map[nx][ny]==-1#새 좌표가 체스판 내에 포함 & 아직 방문X
                map[nx][ny]=map[x][y]+1
                dq.append((nx,ny))
    return map[c][d]
 
for _ in range(n):
    l = int(input())
    a, b = map(int, input().split())
    c, d = map(int, input().split())
    ans = bfs(l,a,b,c,d)
    print(ans)
cs

 

POINT

- BFS 알고리즘을 사용하여 최단 거리를 계산한다.

- 이전 방문 횟수에 1씩 더해가면서 각 좌표까지의 방문 횟수를 기록한다.

- 목표 좌표에 도달하면 bfs탐색을 끝낸다.