알고리즘/DFS,BFS

[백준], 7562번, 나이트의 이동 (파이썬)

Jaden Park 2021. 5. 14. 19:43

문제

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

입력

입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.

각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

출력

각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.

예제 입력1

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

예제 출력1

5
28
0

풀이

from collections import deque

def dfs():
    dx = [-1,-2,-2,-1,1,2,2,1] # 체스 말 움직임1
    dy = [-2,-1,1,2,2,1,-1,-2] # 체스 말 움직임2
    chess = [[0]*l for _ in range(l)]
    queue = deque([[startX,startY]])
    if startX==endX and startY==endY: #시작과 종점이 같을 때 예외처리
        return 0
    while queue and not chess[endX][endY]: #종료조건
        x, y = queue.popleft()
        for i,j in zip(dx,dy): #zip 을 사용하면 더 빠르게 수행할 수 있다고 한다
            nx = x + i
            ny = y + j
            if 0<=nx<l and 0<=ny<l:
                if not chess[nx][ny]:
                    chess[nx][ny] = chess[x][y]+1
                    queue.append([nx,ny])
    return chess[endX][endY]


testCase = int(input())
for _ in range(testCase):
    l = int(input())
    startX,startY = map(int,input().split())
    endX,endY = map(int,input().split())
    print(dfs())

문제해설

bfs 연습할 때 풀었던 문제들과 크게 다르지 않다.

어렵지 않게 풀 수 있는 문제였다.

체스 말 움직임에 따라 8가지의 경우로 반복문을 돌려주면 된다.