ํ์ด
CCTV ์ ๊ฐ์์ ๋ฐ๋ผ์ ๊ฐ์ ๋ฒ์์ ๊ฒฝ์ฐ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด DFS ๋ฅผ ํตํด ์ฌ๊ท์ ์ผ๋ก ํ ์ ์๋ค.
๋จผ์ CCTV ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๊ฐ์ ๋ฐฉํฅ์ ์ ์ํด์ค๋ค. ํ๋ฒ์ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ด ์ฌ๋ฌ๊ฐ์ง์ธ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ๊ฐ CCTV ์ ๊ฐ์ ๋ฐฉํฅ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๊ฐ์ ๋ฐฉํฅ์ ๋ฆฌ์คํธ์ ์ ์ฅํด์ค ๋ค ๊ฒฝ์ฐ์ ์์ ๋ฐ๋ผ ๋ค์ ํ ๋ฒ ๋ฆฌ์คํธ๋ก ๊ฐ์ธ์ค๋ค.
์ดํ ์ ๋ ฅ์ ๋ฐ์ผ๋ฉด์ CCTV ์ ์ข ๋ฅ์ ์ขํ๋ฅผ cctvs ์ ์ ์ฅํด์ค ๋ค dfs ๋ฅผ ์คํํ๋ค.
๊ฐ CCTV ์ ๋ฐฉํฅ๊ณผ ์ขํ์ ๋ฐ๋ผ์ 2 ์ฐจ์แซ ๋ฐฐ์ด์ ์์ ํด ์ค watch ํจ์๋ฅผ ์ ์ธํ๋ค.
์ดํ ๊ฐ CCTV ์ ์ข ๋ฅ์ 2 ์ฐจ์ ๋ฐฐ์ด์ ๋ฐ๊ณ CCTV ์ ์ข ๋ฅ๋ฅผ cam_num ๋ณ์์ ์ ์ฅํ ๋ค cam_num ์ ์ธ๋ฑ์ค๋ก ํ์ฉํด direction ์์ ๊ฐ์ ๋ฐฉํฅ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐ๋ณต๋ฌธ์ ํตํด watch ํจ์์ dfs ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์คํ์ํจ๋ค.
์๋ฅผ ๋ค์ด 2 ์ฐจ์ ๋ฐฐ์ด์ 2๋ฒ CCTV ์ 4๋ฒ CCTV ๊ฐ ์์ ๊ฒฝ์ฐ,
2๋ฒ CCTV ๋ [[0, 1], [2, 3]] ๋ก ์ด 2 ๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ์๊ณ
4๋ฒ CCTV ๋ [[3, 0, 2], [1, 3, 0], [0, 2, 1], [2, 1, 3]] ๋ก ์ด 4 ๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ์๋ค.
์ด๋ด ๊ฒฝ์ฐ cctvs ์๋ [[2, x, y], [4, x, y]] ๊ฐ ์ ์ฅ๋ ๊ฒ์ด๋ค.
dfs ๋ฅผ ์คํ์ํค๋ฉด ์ฒแบ ๋ฒแซ์งธ CCTV ์ธ 2๋ฒ CCTV ์ ๋ํ dfs ๊ฐ ์คํ๋๊ณ ,
for d in direction[can_num] = for d in direction[2] = for d in [[0, 1], [2, 3]] ๊ฐ ๋๋ค.
์ดํ d = [0, 1] ์ ๋ํ watch ํจ์์ dfs ๊ฐ ์คํ๋๋๋ฐ watch ์์ ,
for d in direction = for d in [0, 1] ์ด ๋๊ณ ๊ฐ d ์ ๋ฐ๋ผ์ ๊ฐ์ ๋ฒ์๋ฅผ ์์ ํ ๋ค dfs ๋ฅผ ์คํํ๋ค.
์ ๋ฆฌํ์๋ฉด,
for d in [[0, 1], [2, 3]]:
watch(d)
for d in [[3, 0, 2], [1, 3, 0], [0, 2, 1], [2, 1, 3]]:
watch(d)
์ ๋ํ 2์ค ๋ฐ๋ณต๋ฌธ์ด ์คํ๋๋ ๊ฒ์ด๋ค.
์ฒซ DFS ๋ฌธ์ ์ฌ์ ์ญ์ ๋ง์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๊ณ ์ถํ์ ํ์ด๋ณผ ๋ฌธ์ ์ ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
์์ค์ฝ๋
# ๊ฐ์
import sys
import copy
input = sys.stdin.readline
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
direction = [[], [[0], [1], [2], [3]], [[0, 1], [2, 3]], [[0, 2], [2, 1], [1, 3], [3, 0]], [[3, 0, 2], [1, 3, 0], [0, 2, 1], [0, 2, 1], [2, 1, 3]], [[0, 1, 2, 3]]] # CCTV ์ข
๋ฅ์ ๋ฐ๋ฅธ ๊ฐ์ ๋ฒ์๋ฅผ ๋ฆฌ์คํธ๋ก ์ ์ธ
def watch(x, y, direction, temp):
for d in direction: # ๋ฐฐ์น์ ๋ฐ๋ฅธ ๊ฐ์ ๋ฐฉํฅ ex) 2๋ฒ์ 1๋ฒ์งธ ๊ฐ์ ๊ฒฝ์ฐ์ ์ [0, 1]
nx = x
ny = y
while True:
nx += dx[d]
ny += dy[d]
if 0 <= nx < n and 0 <= ny < m and temp[nx][ny] != 6:
if temp[nx][ny] == 0:
temp[nx][ny] = "#"
else:
break
def dfs(office, cctv):
global ans
temp = copy.deepcopy(office) # ๊ฒฝ์ฐ์ ์์ ๋ฐ๋ผ ๊ฐ์ ๋ฒ์๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋ณต์ ๋ฅผ ์ฌ์ฉ
if cctv == len(cctvs): # ์ด CCTV ๊ฐ์ ๋งํผ์ ์ฌ๊ท์ ๋ค์ด์์ ๊ฒฝ์ฐ
c = 0
for i in temp:
c += i.count(0)
ans = min(ans, c)
return
cam_num, x, y = cctvs[cctv]
for d in direction[cam_num]: # CCTV ์ข
๋ฅ์ ๋ฐ๋ฅธ ๊ฐ์ ๋ฐฉํฅ ex) 2๋ฒ ์ผ ๊ฒฝ์ฐ [[0, 1], [2, 3]]
watch(x, y, d, temp) # [0, 1] ์ ๋ํ ๊ฐ์๋ฒ์ and [2, 3] ์ ๋ํ ๊ฐ์๋ฒ์
dfs(temp, cctv+1) # ๋ค์ CCTV์ ๋ํ DFS
temp = copy.deepcopy(office)
n, m = map(int, input().split())
office = []
cctvs = [] # ์ฌ๋ฌด์ค์ ์๋ CCTV ๋ณ [์ข
๋ฅ, x, y]
ans = n * m
for i in range(n):
line = list(map(int, input().split()))
office.append(line)
for j in range(m):
if 0 < line[j] < 6:
cctvs.append((line[j], i, j))
dfs(office, 0) # CCTV ๊ฐ์์ ๋ฐ๋ผ ๊ฒฝ์ฐ์ ์๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ DFS ์ฌ์ฉ
print(ans)