Liam 일지

백준 7562번 나이트의 이동(python) 본문

Algorithm(백준)

백준 7562번 나이트의 이동(python)

Liam의 일지 2021. 4. 21. 02:26
728x90

문제

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

입력

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

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

출력

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

 

문제설명

문제에서 주어진 나이트의 이동방향을 dx,dy로 리스트의 형태로 나타냅니다.

그리고 deque라이브러리를 이용하여 현재의 위치와 이동방향을 더하여 새로운 좌표를 얻은 후 이동할 수 있는 위치인지 확인한 뒤 이동이 가능하면 그 좌표에 이동한 카운트인 1을 더해줍니다.

 

이 과정을 반복한 뒤에 현재 좌표가 목표위치와 같으면 그 위치의 카운트를 반환해줍니다.

시작 위치를 1로 시작하였기때문에 최종 위치에서 1을 빼줘야합니다.

 

from collections import deque

dx = [-2, -1, 1, 2, 2, 1, -1, -2]
dy = [1, 2, 2, 1, -1, -2, -2, -1]


def solve(x, y, x2, y2):
    q = deque()
    q.append((x, y))

    board[x][y] = 1

    while q:
        cx, cy = q.popleft()
        if cx == x2 and cy == y2:
            print(board[x2][y2] - 1)
            return
        for i in range(8):
            nx = cx + dx[i]
            ny = cy + dy[i]
            if 0 <= nx < n and 0 <= ny < n and board[nx][ny]==0:
                board[nx][ny] = board[cx][cy] + 1
                q.append((nx, ny))


T = int(input())

for _ in range(T):
    n = int(input())
    result = 0
    board = [[0] * n for i in range(n)]
    x, y = map(int, input().split())  # 나이트의 현재위치
    x2, y2 = map(int, input().split())  # 가고자하는 위치
    solve(x, y, x2, y2)

 

'Algorithm(백준)' 카테고리의 다른 글

백준 1927번 최소 힙 (python)  (0) 2021.04.23
백준 1991번 트리순회(python)  (0) 2021.04.23
백준 1939번 중량제한  (0) 2021.04.22
백준 1302번 베스트셀러  (0) 2021.04.21
백준 7490번: 0만들기(BFS, 재귀함수)  (0) 2021.04.20