ํฐ์คํ ๋ฆฌ ๋ทฐ
์ฐ๊ตฌ์ ์๋ฆฌ์ฆ
๋ฌธ์
๋ฌธ์ ํ์ด
์ฐ๊ตฌ์์ ๋ฐ์ด๋ฌ์ค ์ค์น ๊ฐ๋ฅํ ์์น๊ฐ ์๊ณ , ์ค์น ๊ฐ๋ฅํ ๋ฐ์ด๋ฌ์ค ์๊ฐ M๊ฐ๋ค. ๋ฐ์ด๋ฌ์ค๋ ํ๋ฃจ๋ง๋ค ์, ํ, ์ข, ์ฐ๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ์ ํ์ํจ๋ค. ์ด๋ ์ด๋ค ์์น์์ ๋ฐ์ด๋ฌ์ค M๊ฐ๋ฅผ ์ค์นํ์ฌ, ์ต์ ๋ ์ง๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ๋ชจ๋ ์ ํ์ํฌ ์ ์๋ ์ง๋ฅผ ์ฐพ์ ๋ฐํํ๋ฉด ๋๋ค. ์ฐ๊ตฌ์ค ๋ด์ ๋ฒฝ์ ์ ์ธํ ๋ชจ๋ ๊ตฌ๊ฐ์ ๋ฐ์ด๋ฌ์ค ์ ํ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ -1์ ๋ฐํํ๋ค.
์์ ๋ค๋ฃฌ ์ฐ๊ตฌ์์์๋ DFS๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ์กฐํฉ์ ๊ตฌํ์์ง๋ง, itertools๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค. (๋จ, ์ผ์ฑ ์ญ๋ํ ์คํธ์์๋ itertools๋ฅผ ์ฌ์ฉํ ์ ์๋ค.) ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ก์ง์ ํตํด ํ ์ ์๋ค.
- DFS ๋๋ itertools๋ฅผ ํ์ฉํ์ฌ, ๋ฐ์ด๋ฌ์ค M๊ฐ๊ฐ ์ค์น๋ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๋๋ค.
- ๊ฐ ๊ฒฝ์ฐ์ ์๋ง๋ค, BFS๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ผ์ํจ ์๋ (0์ ๊ฐ์ + ๋ฐ์ด๋ฌ์ค ์ - M)๊ณผ ๊ฐ์ผ๋ฉด ๋ชจ๋ ๊ฐ์ผ๋ ๊ฒ์ด๋ค.
- ๊ฐ์ผ์ํค๋๋ฐ ๊ฑธ๋ฆฌ๋ ๊ฐ๋ค ์ค ์ต์๊ฐ์ ์ฐพ๋๋ค.
- ๋ชจ๋ ๊ฒฝ์ฐ์์ (0์ ๊ฐ์ + ๋ฐ์ด๋ฌ์ค ์ - M)์ ๊ฐ์ง ์์ผ๋ฉด -1์ ๋ฐํํ๋ค.
์ฝ๋
from sys import stdin
from collections import deque
from itertools import combinations
from math import inf
def visitable(x, y, visited):
return 0 <= x < n and 0 <= y < n and graph[x][y] != 1 and not visited[x][y]
def bfs(infect, start):
q = deque(start)
dirs = ((0, 1), (0, -1), (1, 0), (-1, 0))
visited = [[False] * n for _ in range(n)]
cur_time, cur_infect = 0, 0
# ์ด๊ธฐ ๋ฐ์ด๋ฌ์ค ํ์ฑํ ์ง์ ๋ฐฉ๋ฌธ ํ์.
for x, y, _ in q:
visited[x][y] = True
while q:
x, y, time = q.popleft()
for dx, dy in dirs:
next_x, next_y = x + dx, y + dy
if visitable(next_x, next_y, visited):
visited[next_x][next_y] = True
cur_time = time + 1
cur_infect += 1
q.append((next_x, next_y, time + 1))
return cur_time if cur_infect == infect else answer
def find_loc():
global zero, virus
loc = []
for i in range(n):
for j in range(n):
if graph[i][j] == 2:
# ํ์์ time ์ ๋ณด๋ฅผ ํ์ฉํ๊ธฐ ์ํด 0์ ์ถ๊ฐํจ.
loc.append([i, j, 0])
virus += 1
if graph[i][j] == 0:
zero += 1
return combinations(loc, m)
if __name__ == '__main__':
n, m = map(int, stdin.readline().split())
graph = [list(map(int, stdin.readline().split())) for _ in range(n)]
zero, virus, answer = 0, 0, inf
for candi in find_loc():
answer = min(answer, bfs(zero + virus - m, candi))
print(answer if answer != inf else -1)
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 4811 ์์ฝ (0) | 2020.09.19 |
---|---|
๋ฐฑ์ค: 17142 ์ฐ๊ตฌ์ 3 (0) | 2020.09.17 |
๋ฐฑ์ค: 3184 ์ (0) | 2020.09.15 |
๋ฐฑ์ค: 1600 ๋ง์ด ๋๊ณ ํ ์์ญ์ด (0) | 2020.09.14 |
๋ฐฑ์ค: 14395 4์ฐ์ฐ (0) | 2020.09.13 |