728x90
https://www.acmicpc.net/problem/2573
2573๋ฒ: ๋น์ฐ
์ฒซ ์ค์๋ ์ด์ฐจ์ ๋ฐฐ์ด์ ํ์ ๊ฐ์์ ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N๊ณผ M์ด ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. N๊ณผ M์ 3 ์ด์ 300 ์ดํ์ด๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๋ฐฐ์ด์ ๊ฐ ํ์
www.acmicpc.net
bfs๋ก ์ ์งํ๊ฒ ํ์ด์ฃผ์๋ค..!
๋ด ์ฝ๋๋ก๋ python3๋ก๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๊ณ , pypy3๋ก๋ ์ ๋ต ํ์ ์ ๋ฐ์๋ค.
1. ๋น์ฐ์ด ๋ช๋ฉ์ด๋ฆฌ์ธ์ง ํ์ธ
1-1. ๋ ๋ฉ์ด๋ฆฌ ์ด์์ด๋ผ๋ฉด, ๊ฒฝ๊ณผ์๊ฐ(year)์ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ ์ข ๋ฃ
2. ๋น์ฐ ๋ น์ด๊ธฐ ์์ ๋ฐ ๊ฒฝ๊ณผ์๊ฐ(๋ ) ์ฆ๊ฐ
3. ๋น์ฐ์ด ๋ชจ๋ ๋ น์๋์ง ์ฒดํฌํ๊ณ , ๋ชจ๋ ๋ น์๋ค๋ฉด 0์ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ ์ข ๋ฃ
์ฝ๋
from collections import deque
import sys
input = sys.stdin.readline
n,m = map(int, input().split())
arr = []
for _ in range(n):
arr.append( list(map(int, input().split())) )
visited = [[0 for _ in range(m)] for _ in range(n)]
answer = 0
def bfs(x,y):
q = deque()
q.append((x,y))
visited[x][y] = 1
dx, dy = [-1,0,1,0], [0,1,0,-1]
while q:
x,y = q.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and arr[nx][ny]>0:
visited[nx][ny] = 1
q.append((nx,ny))
# ๋น์ฐ์ด ํ๋ฉ์ด๋ฆฌ์ธ์ง ์ฒดํฌ
def check():
# visited ์ด๊ธฐํ
for i in range(n):
for j in range(m):
visited[i][j] = 0
cnt = 0
for i in range(n):
for j in range(m):
if arr[i][j] != 0 and visited[i][j] == 0:
bfs(i,j)
cnt += 1
return cnt
q = deque()
def melt(x,y):
# ๋ฐฉ๋ฌธ๋ฐฐ์ด ์ด๊ธฐํ
for i in range(n):
for j in range(m):
visited[i][j] = 0
q.append((x,y))
visited[x][y] = 1
dx = [-1,0,1,0]
dy = [0,1,0,-1]
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0<=nx<n and 0<=ny<m and arr[nx][ny]==0 and arr[x][y]>0:
arr[x][y] -= 1
while q:
x, y = q.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and arr[nx][ny]>0:
visited[nx][ny] = 1
for j in range(4):
tx, ty = nx + dx[j], ny + dy[j]
if 0 <= tx < n and 0 <= ty < m and not visited[tx][ty] and arr[tx][ty]==0:
if arr[nx][ny] > 0:
arr[nx][ny] -= 1
q.append((nx,ny))
while True:
# ๋น์ฐ์ด ๋ช๋ฉ์ด๋ฆฌ์ธ์ง ์ฒดํฌ
if check() > 1:
print(answer)
break
# ๋น์ฐ ๋
น๋ ์์
flag = False
for i in range(n):
for j in range(m):
if arr[i][j] > 0:
melt(i,j)
flag = True
break
if flag:
break
answer += 1 # 1๋
์ถ๊ฐ
# ๋น์ฐ์ด ๋ค ๋
น์๋์ง ์ฒดํฌ
flag = False
for i in range(n):
for j in range(m):
if arr[i][j] != 0:
flag = True
break
if flag:
break
if flag == False:
print(0)
break
728x90
'์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด > DFS,BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] ํฌ๋์ฃผ ์์ (1) | 2024.11.25 |
---|---|
[๋ฐฑ์ค]5014๋ฒ: ์คํํธ๋งํฌ (0) | 2023.07.23 |
[๋ฐฑ์ค]11725๋ฒ: ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ (0) | 2023.07.18 |
[๋ฐฑ์ค]1926๋ฒ: ๊ทธ๋ฆผ (0) | 2023.07.16 |
[๋ฐฑ์ค]14940๋ฒ: ์ฌ์ด ์ต๋จ๊ฑฐ๋ฆฌ (0) | 2023.07.03 |