백준18401
이코테 345p
-> 특정 좌표 (X,Y)에 S초 뒤에 어떤 바이러스가 있는지 출력하시오
- BFS를 활용하면, S초가 지남에 따른 갈수 있는 범위를 셀 수 있다는 것 ! !
- 이런 아이디어는 도달할 수 있는 최단거리에 BFS를 활용한 아이디어를 다른방식으로 활용한 것이다.
- 낮은 번호 부터 증식 = 큐에 먼저 넣는다는 생각
from collections import deque
n, k = map(int, input().split())
graph = []
data = []
for i in range(n) :
# 보드 정보를 한 줄 단위로 입력
graph.append(list(map(int, input().split())))
for j in range(n) :
# 해당 위치에 바이러스 존재하는 경우
if graph[i][j] != 0 :
# (바이러스 종류, 시간, 위치 X, 위치 Y) 삽입
data.append((graph[i][j], 0, i, j))
# 정렬 이후에 큐로 옮기기 (낮은 번호의 바이러스가 먼저 증식하므로)
data.sort()
q = deque(data) # 큐 생성
target_s, target_x, target_y = map(int, input().split())
# 바이러스가 퍼져나갈 수 있는 4가지 위치
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 너비 우선 탐색(BFS) 진행
while q :
virus, s, x, y = q.popleft()
# 정확히 S초 지나거나, 큐가 빌때까지 반복
if s == target_s :
break
# 현재 노드에서 주변 4가지 위치를 각각 확인
for i in range(4) :
nx = x + dx[i]
ny = x + dy[i]
# 해당 위치로 이동할 수 있는 경우
if 0 <= nx and nx < n and 0 <= ny and ny < n :
# 아직 방문하지 않ㅇ느 위치라면, 그 위치에 바이러스 넣기
if graph[nx][ny] == 0 :
graph[nx][ny] = virus
q.append((virus, s+1, nx, ny))
print(graph[target_x-1][target_y-1])