๋ฐฑ์ค 2638๋ฒ
https://www.acmicpc.net/problem/2638
๋ฌธ์
ํ๊ธฐ
์ผ๋ง์ ์ ์์ฑ ํ์๋ #2636 ์น์ฆ์ ๊ฑฐ์ ๋๊ฐ์ ๋ฌธ์ ๋ค.
๋จ์ง ์ฐจ์ด์ ์, ์น์ฆ๊ฐ ํ ๋ฉด์ ๋ฐ๊นฅ ๊ณต๊ธฐ์๋ง ๋ฟ์๋ ๋ น๋๋, ๋ฐ๊นฅ ๊ณต๊ธฐ์ ๋ ๋ฉด ์ด์ ๋ฟ์์ผ
๋ น๋๋์ ๋ฌธ์ ์ด๋ค.
remove_cheese์์ ์น์ฆ๊ฐ
(์์ค๋ฅธ์ชฝ), (์์๋), (์์ผ์ชฝ), (์ค๋ฅธ์ชฝ์๋), (์ค๋ฅธ์ชฝ์ผ์ชฝ), (์๋์ผ์ชฝ)
์ด 6๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํ์ฌ ๋ น์ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
์ด ์ธ์๋ 2636 ์น์ฆ์ ๊ฐ์ ๋ฌธ์ ์ด๋ฏ๋ก ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
๋์ ํ์ด
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**7)
n, m = map(int,input().split())
graph= []
for i in range(n):
graph.append(list(map(int,input().split())))
visited= [ [False] * m for _ in range(n)]
# ํ์ด์์ cheese์ ์์ ์ฒดํฌํด์ 0์ด ์๋๋ฉด ๋ฐ๋ณต์คํ
# ๋ฐ๊นฅ์ ์๋ ๊ณต๊ธฐ๋ค์ ์ฐ์ 9๋ก ์ ๋ถ ๋ฐ๊พธ๊ณ ( ๋ฐ๊นฅ๊ณต๊ธฐ ์์ชฝ๊ณต๊ธฐ ํ๋ณ )
# 9์ ์ ํด์๋ ์น์ฆ๋ค์ ๋ชจ๋ ๋
น์ธ๋ค.
# ํ๋ฒ์ ๋ชจ๋ ์ ๊ฑฐํ๋ค. time์ 1 ์ฆ๊ฐ์ํจ๋ค. ํ์ฌ ๋จ์ ์น์ฆ์ ์์ ์ ์ฅํ๋ค.
# visited๋ฅผ ์ด๊ธฐํํ๊ณ , ๋ฐ๋ณตํ๋ค.
def check_cheese(x,y): # ๊ณต๊ธฐ๊ฐ ๋ฐ๊นฅ๊ณต๊ธฐ ์ธ์ง ํ๋ณํ๋ ํจ์
if x<=-1 or x>=n or y<=-1 or y>=m :
return False
if not visited[x][y] and (graph[x][y] ==0 or graph[x][y]==9):
graph[x][y] = 10 #๋ฌดํ๋ฃจํ๋ฅผ ๋์ง์๊ธฐ ์ํด ์ผ๋จ 10์ผ๋ก ๋ง๋ค์ด ๋๊ณ
check_cheese(x,y-1)
check_cheese(x,y+1)
check_cheese(x+1,y)
check_cheese(x-1,y)
return True
return False
def remove_cheese(x,y): #์น์ฆ๊ฐ ๋ฐ๊นฅ ๊ณต๊ธฐ์ ๋ฟ์์๋์ง ํ๋ณํ๋ ํจ์
global cncnt
global cnt
if x<=-1 or x>=n or y<=-1 or y>=m:
return False
if not visited[x][y] and graph[x][y] == 1 and ( ( graph[x][y+1] ==9 and graph[x+1][y] == 9 ) or ( graph[x][y+1] ==9 and graph[x][y-1] == 9 ) or
( graph[x][y+1] ==9 and graph[x-1][y] == 9 ) or ( graph[x+1][y] ==9 and graph[x][y-1] == 9 ) or ( graph[x+1][y] ==9 and graph[x-1][y] == 9 ) or ( graph[x][y-1] ==9 and graph[x-1][y] == 9 )):
graph[x][y] = -3
cnt +=1 #๋
น์ ์น์ฆ์ ์์ด๋ค.
return True
return False
cheese = 0 #์ ์ฒด์น์ฆ์์
now_cheese = [] #ํ์ฌ ์น์ฆ์ ์์ ์ ์ฅํ ๋ฆฌ์คํธ
time = 0 #์น์ฆ๋ฅผ ๋
น์ด๋๋ฐ ๊ฑธ๋ฆด์๊ฐ
#์น์ฆ์ ์์ ๊ทธ๋ํ๋ฅผ ๋๋ฉฐ ๊ตฌํ๋ค. ์ ์ฒด ์น์ฆ์ ์์ ๊ตฌํด์ผ ์น์ฆ๊ฐ 0์ด ๋์ ๋ ํจ์๋ฅผ ์ข
๋ฃํ ์ ์๊ธฐ ๋๋ฌธ
for i in range(n):
for j in range(m):
if graph[i][j] == 1:
cheese+=1
while True: #์น์ฆ๊ฐ 0์ด ๋๊ธฐ ์ ๊น์ง ๊ณ์ ๋์์
if cheese ==0:
print(time)
exit()
check_cheese(0,0)
#graph๋ฅผ ๋๋ฉด์ 10์ผ๋ก ๋ง๋ค์ด ๋์๋ ๊ณต๊ธฐ๋ค์ ๋ฐ๊นฅ ๊ณต๊ธฐ์ธ 9๋ก ๋ง๋ ๋ค. ๋ฌดํloop๋ฅผ ๋์ง์๊ธฐ์ํ ์์
for i in range(n):
for j in range(m):
if graph[i][j]==10:
graph[i][j] = 9
visited= [ [False] * m for _ in range(n)] #๋ฐ๊นฅ ๊ณต๊ธฐ๋ฅผ ๋๋ฉฐ visited๋ฅผ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ์ด๊ธฐํ๋ฅผ ํด์ค๋ค.
cnt = 0 #์น์ฆ๊ฐ ๋ช๊ฐ ๋
น์ ์์ ์ธ์ง๋ ์ด๊ธฐํ
for i in range(n):
for j in range(m):
if not visited[i][j]:
remove_cheese(i,j) #์น์ฆ๋ฅผ ์ ๊ฑฐํ ์ค๋น
cheese -= cnt
for i in range(n):
for j in range(m):
if graph[i][j]==-3:
graph[i][j] = 9 #์น์ฆ๊ฐ ๋
น์๋ค
time +=1 # ๋ชจ๋ ์์
์ด ๋๋ฌ์ผ๋ 1์๊ฐ ๊ฒฝ๊ณผํ๋ค.