본문 바로가기

이코테

[17번] 경쟁적 전염

https://www.acmicpc.net/problem/18405

 

18405번: 경쟁적 전염

첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치

www.acmicpc.net

경쟁적 전염: K초 후 바이러스 전파결과 확인

 

  • 탐색방향: 상하좌우
  • 탐색조건: MAP == 0
  • 탐색결과: MAP = 1, 2, 3, ... (바이러스 영역으로 변경)
  • 출발점: 바이러스 위치들
  • 알고리즘 선택: S초까지 탐색 => BFS

 

import collections

N, K = map(int, input().split())
MAP = []
viruses = []
for r in range(N):
    MAP.append(list(map(int, input().split())))
    for c in range(N):
        if MAP[r][c] != 0:
            viruses.append((MAP[r][c], 0, r, c))
viruses.sort()  # 낮은 바이러스 순서로 전파

S, X, Y = map(int, input().split())

# 바이러스 전파 (BFS)
qu = collections.deque(viruses)
while qu:
    vtype, second, x, y = qu.popleft()
    if second == S:  # S초까지 탐색
        break

    for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
        nx, ny = x + dx, y + dy
        if 0 <= nx < N and 0 <= ny < N:
            if MAP[nx][ny] == 0:
                MAP[nx][ny] = vtype
                qu.append((vtype, second + 1, nx, ny))

print(MAP[X - 1][Y - 1])  # 3

3 3
1 0 2
0 0 0
3 0 0
2 3 2

'이코테' 카테고리의 다른 글

[19번] 연산자 끼워 넣기  (0) 2021.05.04
[18번] 괄호 변환  (0) 2021.05.04
[16번] 연구소  (0) 2021.05.03
[15번] 특정거리의 도시 찾기  (0) 2021.05.03