DFSλ₯Ό νμ
νμ§λͺ»νκ³ , cctv λ°©ν₯μ μ ννκ³ μ΄λ»κ² λμμμΌνλμ§ νμ
νμ§λͺ»ν¨μ΄λ° μ λ°ν μμ΄λμ΄λ₯Ό λ°κ²¬ν μ μμλ€.μνμ’μ° xμ’ν, yμ’ν 리μ€νΈ κ·Έλλ‘ ν΄λκ³ , cctv λ°©ν₯μ κ·Έ
μ’ν 리μ€νΈμ indexλ‘ μ€μ ν΄μ ꡬνλ€.
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
# κ° cctvλ³λ‘ κ°μν μ μλ λ°©ν₯
direction = [
[], # cctvκ° μλ κ²½μ°λ μμ μ μμ
[[0], [1], [2], [3]],
[[0, 2], [1, 3]],
[[0, 1], [1, 2], [2, 3], [0, 3]],
[[0, 1, 2], [0, 1, 3], [1, 2, 3], [0, 2, 3]],
[[0, 1, 2, 3]],
]
λ°±νΈλνΉ β DFS μ΄μ©
κ·Έλ¦¬κ³ λ μ€μν ν¬μΈνΈλ λ€μ μμνλ‘ λ³΅κ΅¬ν΄μ£Όλ κ²μ΄λ€!
def dfs(depth, office):
global answer
if depth == len(cctv):
count = 0
# μ¬κ°μ§λ ꡬνλ ν¨μ
for i in range(n):
count += office[i].count(0)
# κ° μΌμ΄μ€λ§λ€ μ¬κ°μ§λ κ°μ κ°μ₯ μμ κ°μΌλ‘ μ
λ°μ΄νΈ
answer = min(answer, count)
return
# μλ officeμ μν₯μ λ―ΈμΉμ§ μκ² νκΈ° μν΄μ μ¬μ©
office_tmp = deepcopy(office)
cctv_num, x, y = cctv[depth]
for d in direction[cctv_num]:
fill(x, y, d, office_tmp)
dfs(depth + 1, office_tmp)
# dfs νμ μλ£ νμ κ·Έ μ΄μ μνλ‘ λ리기 μν΄ μ¬μ© -> κ·ΈλμΌ dfs νμ μ€μ μνλ λ³κ²½μ¬ν μ·¨μκ°λ₯
**office_tmp = deepcopy(office)**
import sys
from copy import deepcopy
input = sys.stdin.readline
n, m = map(int, input().split())
cctv = []
office = []
# ννλ‘ xμ’ν, yμ’νλ‘ κ΅¬μ± -> dicμΌλ‘ λ°κΏ, κ΅³μ΄ xμ’ν/yμ’νλ‘ λλ μ λ£μ§μμ
# κ° cctvλ³λ‘ κ°μν μ μλ λ°©ν₯
direction = [
[], # cctvκ° μλ κ²½μ°λ μμ μ μμ
[[0], [1], [2], [3]],
[[0, 2], [1, 3]],
[[0, 1], [1, 2], [2, 3], [0, 3]],
[[0, 1, 2], [0, 1, 3], [1, 2, 3], [0, 2, 3]],
[[0, 1, 2, 3]],
]
# μ - μ€ - μλ - μΌ
# direction 리μ€νΈκ° μ΄ μ’ν리μ€νΈμ μΈλ±μ€λ₯Ό λνλ΄λ―λ‘ cctv λ°©ν₯ 쑰건μ λ§μΆμ΄ μ - μ€ - μλ - μΌ μμλ‘ μ΄κΈ°ν
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
for i in range(n):
data = list(map(int, input().split()))
office.append(data)
for j in range(m):
if data[j] in [1, 2, 3, 4, 5]:
# cctvμ μ’
λ₯μ μμΉλ₯Ό cctv 리μ€νΈλ₯Ό μ
λ°μ΄νΈ
cctv.append([data[j], i, j])
def fill(x, y, d, office_copy) :
for i in d:
nx = x
ny = y
while True:
# μνμ’μ° xμ’ν, yμ’ν 리μ€νΈ κ·Έλλ‘ ν΄λκ³ , cctv λ°©ν₯μ μ’ν 리μ€νΈμ indexλ‘ μ€μ ν΄μ ꡬν¨
nx += dx[i]
ny += dy[i]
# λ²μμ λ²μ΄λ¬μΌλ©΄
if nx < 0 or ny < 0 or nx >= n or ny >= m:
break
# λ²½μ λ§λ¬λ€λ©΄
if office_copy[nx][ny] == 6:
break
# 0μ΄λΌλ©΄, '#'λμ '-1'λ‘ λ³κ²½μν€κΈ°
elif office_copy[nx][ny] == 0:
office_copy[nx][ny] = -1
def dfs(depth, office):
global answer
if depth == len(cctv):
count = 0
# μ¬κ°μ§λ ꡬνλ ν¨μ
for i in range(n):
count += office[i].count(0)
# κ° μΌμ΄μ€λ§λ€ μ¬κ°μ§λ κ°μ κ°μ₯ μμ κ°μΌλ‘ μ
λ°μ΄νΈ
answer = min(answer, count)
return
# μλ officeμ μν₯μ λ―ΈμΉμ§ μκ² νκΈ° μν΄μ μ¬μ©
office_tmp = deepcopy(office)
cctv_num, x, y = cctv[depth]
for d in direction[cctv_num]:
fill(x, y, d, office_tmp)
dfs(depth + 1, office_tmp)
# dfs νμ μλ£ νμ κ·Έ μ΄μ μνλ‘ λ리기 μν΄ μ¬μ© -> κ·ΈλμΌ dfs νμ μ€μ μνλ λ³κ²½μ¬ν μ·¨μκ°λ₯
office_tmp = deepcopy(office)
answer = int(1e9)
dfs(0, office)
print(answer)