ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

7562번: λ‚˜μ΄νŠΈμ˜ 이동

문제 체슀판 μœ„μ— ν•œ λ‚˜μ΄νŠΈκ°€ 놓여져 μžˆλ‹€. λ‚˜μ΄νŠΈκ°€ ν•œ λ²ˆμ— 이동할 수 μžˆλŠ” 칸은 μ•„λž˜ 그림에 λ‚˜μ™€μžˆλ‹€. λ‚˜μ΄νŠΈκ°€ μ΄λ™ν•˜λ €κ³  ν•˜λŠ” 칸이 주어진닀. λ‚˜μ΄νŠΈλŠ” λͺ‡ 번 움직이면 이 칸으둜 이동할

www.acmicpc.net

 

문제 풀이

  μ•žμ„œ 닀룬 2178 미둜 탐색과 λ™μΌν•œ λ°©μ‹μœΌλ‘œ ν’€λ©΄ λœλ‹€. 차이점이 μžˆλ‹€λ©΄ νƒμƒ‰ν•˜λŠ” λ°©ν–₯이 λŒ€κ°μ„  8 λ°©ν–₯μ΄λΌλŠ” 것뿐이닀. λ‚˜μ΄νŠΈκ°€ 이동할 수 μžˆλŠ” 경둜둜 이동할 λ•Œ, ν˜„μž¬ κ²½λ‘œκΉŒμ§€ μ˜€λŠ”λ° μ΄λ™ν•œ 횟수λ₯Ό 계속 λˆ„μ ν•΄κ°€λ©° μ΄λ™ν•˜λ©΄ λœλ‹€. λ”°λΌμ„œ μ›ν•˜λŠ” 도착 μœ„μΉ˜μ— λ„μ°©ν–ˆμ„ λ•Œ μ€‘μ²©λœ 값이 찾고자 ν•˜λŠ” 닡이닀.

 

μ½”λ“œ

from sys import stdin
from collections import deque


def visitable(x, y):
    return 0 <= x < l and 0 <= y < l and not graph[x][y]


def bfs(start, end):
    q = deque([start])

    while q:
        if q[0] == end:
            x, y = end
            break

        cur_x, cur_y = q.popleft()

        for x, y in dirs:
            next_x, next_y = x + cur_x, y + cur_y
            if visitable(next_x, next_y):
                graph[next_x][next_y] = graph[cur_x][cur_y] + 1
                q.append([next_x, next_y])

    return graph[x][y]


if __name__ == "__main__":
    tc = int(stdin.readline())

    for _ in range(tc):
        l = int(stdin.readline())
        start = list(map(int, stdin.readline().split()))
        end = list(map(int, stdin.readline().split()))
        dirs = ((-1, 2), (1, 2), (2, 1), (2, - 1),
                (1, -2), (-1, -2), (-2, -1), (-2, 1))

        graph = [[0] * l for _ in range(l)]
        print(bfs(start, end))
728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€