Python3/백준 알고리즘

2022.02.12 [백준] (python 파이썬) 나이트의 이동

ian's coding 2022. 2. 12. 16:51
728x90
반응형

 

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

 

7562번: 나이트의 이동

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

www.acmicpc.net


풀이

이 문제는 시작 좌표부터 목표 좌표까지 도달하기 위해 움직여야할 횟수를 출력하는 문제이다.

즉, 이 문제는 a에서 b까지의 최단거리를 구하는 문제이기 때문에 bfs를 이용하여 문제를 해결해야 한다.

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
34
35
36
37
38
39
40
 
from collections import deque
 
#나이트가 갈 수 있는 거리 저장
dx=[-2,-2,-1,-1,1,1,2,2]
dy=[1,-1,2,-2,2,-2,1,-1]
 
 
def bfs(x, y, _x, _y):
    #방문해야 할 곳을 저장하는 덱 생성 및 초기화
    deq=deque()
    deq.append([x, y])
    #덱에 데이터가 들어있을때까지 while문 반복
    while deq:
        #덱에서 먼저 들어간 데이터를 pop하고 
        #pop한 데이터가 타겟 좌표인 _x, _y와 같으면 arr[x][y]값 리턴
        x,y=deq.popleft()
        if x==_x and y==_y:
            return arr[x][y]
        for i in range(len(dx)):
            nx=x+dx[i]
            ny=y+dy[i]
            #나이트가 이동할 좌표의 범위 확인
            if 0<=nx<and 0<=ny<l:
                #이동 할 좌표의 값이 0이면 한번도 방문하지 않은 곳
                if arr[nx][ny]==0:
                    deq.append([nx,ny])
                    arr[nx][ny]=arr[x][y]+1
 
for _ in range(int(input())):
    l=int(input())
    # l X l크기의 체스판 생성
    arr=[[0]*for _ in range(l)]
    #시작 지점
    x,y = map(int, input().split())
    #목표 지점
    t_x,t_y = map(int, input().split())
    ans = bfs(x,y,t_x,t_y)
    print(ans)
 
cs

 

 

 

 

728x90
반응형