[BaekJoon 7562 : DFS/BFS, Python] - 나이트의 이동

2021, Oct 18    


백준 나이트의 이동 : 실버 2



Solution


from collections import deque

def knightMove(l, start, end):
    dx = [-2, -1, 1, 2, 2, 1, -1, -2]
    dy = [-1, -2, -2, -1, 1, 2, 2, 1]

    graph = [[0]*l for i in range(l)]
    cx, cy = start
    gx, gy = end
    graph[cy][cx] = 0 
    dq = deque()
    dq.append([cx, cy])

    while dq:
        cx, cy = dq.popleft()
        for j in range(8):    
            nx = cx + dx[j]
            ny = cy + dy[j]
            if 0 <= nx < l and 0 <= ny < l :
                if graph[ny][nx] == 0:  
                    graph[ny][nx] = graph[cy][cx] + 1
                    if cx == gx and cy == gy: 
                        return graph[cy][cx]
                    dq.append([nx, ny])
                      
    return graph[gy][gx]

n = int(input())
for i in range(n):
    l = int(input())
    x0, y0 = map(int, input().split())
    x1, y1 = map(int, input().split())
    if x0 == x1 and y0 == y1: print(0)
    else:
        print(knightMove(l, (x0, y0), (x1, y1)))


풀이과정 및 느낀점


대표적인 bfs를 이용한 구현 문제이다. 이동방향이 많아서 뭔가 어려워 보이지만 생각보다 생각대로 된다. 포인트는 이동횟수이기 때문에 직전 이동횟수 + 1 씩 올려줘야 한다는 점.