Post

[BOJ] 현명한 나이트 - 18404 (S1)

[BOJ] 현명한 나이트 - 18404 (S1)
시간 제한메모리 제한
2 초256 MB

문제

크기가 N × N인 체스판의 특정한 위치에 하나의 나이트가 존재한다. 이때 M개의 적들의 위치 값이 주어졌을 때, 각 적까지 이동하기 위한 최소 이동 수를 계산하는 프로그램을 작성하시오.

나이트는 일반적인 체스에서와 같이 8가지 방향으로 이동할 수 있다.

풀이

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
from collections import deque

N, M = map(int, input().split())

dxy = ((1, 2), (2, 1), (-1, 2), (2, -1), (1, -2), (-2, 1), (-1, -2), (-2, -1))

x, y = map(int, input().split())

enemy_list = [tuple(map(int, input().split())) for _ in range(M)]
result = [0] * M

q = deque([(x, y, 1)])
find_cnt = 0
visited = set([(x, y)])

while q:
    cur_x, cur_y, t = q.popleft()

    for dx, dy in dxy:
        n_x, n_y = cur_x + dx, cur_y + dy
        if (n_x, n_y) in visited:
            continue
        if (n_x, n_y) in enemy_list:
            enemy_idx = enemy_list.index((n_x, n_y))
            if result[enemy_idx] != 0:
                continue
            result[enemy_idx] = t
            find_cnt += 1
        if find_cnt == M:
            break
        q.append((n_x, n_y, t + 1))
        visited.add((n_x, n_y))
    else:
        continue
    break

print(*result)

시간 복잡도

O(N^2)

This post is licensed under CC BY 4.0 by the author.