https://www.acmicpc.net/problem/17142
내 풀이:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
def BFS(lst):
global ans
q = []
for idx in lst:
q.append(virus[idx])
visited = [[False] * N for _ in range(N)]
new = [arr[i][:] for i in range(N)]
for y, x in q:
visited[y][x] = True
result = 0
while q:
TF = True
for c in range(len(q)):
y, x = q.pop(0)
for dir in range(4):
ny = y + dy[dir]
nx = x + dx[dir]
if 0 <= ny <= N-1 and 0 <= nx <= N-1 and not visited[ny][nx]:
if new[ny][nx] == 0:
new[ny][nx] = 2
visited[ny][nx] = True
q.append((ny, nx))
TF = False
elif new[ny][nx] == 2:
visited[ny][nx] = True
q.append((ny, nx))
if TF:
break
result += 1
for i in range(N):
for j in range(N):
if new[i][j] == 0:
return
if ans > result:
ans = result
def order(idx, lst):
global cnt
if len(lst) == M:
BFS(lst)
return
for i in range(lst[-1]+1, len(virus)):
if i not in lst:
lst.append(i)
order(idx + 1, lst)
lst.pop()
N, M = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(N)]
ans = 3000
dy = [-1, 0, 1, 0]
dx = [0, 1, 0, -1]
virus = []
cnt = 0
for i in range(N):
for j in range(N):
if arr[i][j] == 2:
virus.append((i, j))
cnt += 1
for i in range(len(virus)):
order(1, [i])
if ans == 3000:
print(-1)
else:
print(ans)
|
Python3, 1000ms
전형적인 BFS 탐색 문제인 것 같다. 다만 주의해야 할 점은 이미 0은 모두 제거했는데 뒤늦게 활성화된 바이러스가 큐에 들어갈 수 있기 때문에 0이 하나도 발견되지 않은 경우에 while문을 나갈 수 있도록 장치를 해주었다.
파이썬으로 풀어보는 백준 16235번: 나무 재테크 (삼성 A형 기출 문제) (0) | 2020.02.13 |
---|---|
파이썬으로 풀어보는 백준 15684번: 사다리 조작 (삼성 A형 기출 문제) (0) | 2020.02.13 |
파이썬으로 풀어보는 백준 12100번: 2048 (삼성 A형 기출 문제) (0) | 2020.02.11 |
파이썬으로 풀어보는 백준 15683번: 감시 (삼성 A형 기출 문제) (0) | 2020.02.10 |
파이썬으로 풀어보는 백준 16234번: 인구 이동 (삼성 A형 기출 문제) (0) | 2020.02.08 |
댓글 영역