n * n 격자에 담긴 1 * 1의 계란틀
규칙
계란의 양이 너무 차이나지 않게 하기 위해 하나의 선을 맞대고 있는 두 계란틀의 양의 차이가 L이상 R이하라면 계란틀의 해당 선 분리
모든 계란틀에 대해 검사 실시, 1 규칙에 해당하는 모든 계란틀의 선 분리
선의 분리를 통해 합쳐진 계란틀의 계란은 하나로 합치고 이후에 다시 분리
합쳤다 다시 분리한 이후의 계란틀 별 계란의 양은 (합쳐진 계란 총 합)/(합쳐진 계란틀 수), 편의상 소수점 버림
위 과정이 1번의 계란 이동이며, 더 이상 이동이 필요 없을 때까지 과정 반복
⇒ n*n 격자의 계란 틀에 있는 계란의 양 주어질 때, 계란의 이동이 몇 번 일어나는지 출력
from collections import deque
n, L, R = map(int, input().split())
eggs = [ list(map(int, input().split())) for _ in range(n)]
answer = 0
dr = [1, -1, 0, 0]
dc = [0, 0, 1, -1]
def bfs(r, c):
group = [(r,c)]
queue = deque()
queue.append((r,c))
while queue:
cr, cc = queue.popleft()
for i in range(4):
nr = cr + dr[i]
nc = cc + dc[i]
if 0 <= nr < n and 0 <= nc < n and not visited[nr][nc]:
if L <= abs(eggs[nr][nc] - eggs[cr][cc]) <= R:
visited[nr][nc] = True
group.append((nr, nc))
queue.append((nr, nc))
return group
while True:
# find groups that have L < diff < R
stop = True
visited = [[False for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(n):
if not visited[i][j]:
visited[i][j] = True
group = bfs(i, j)
if len(group) > 1:
stop = False
egg = sum([eggs[r][c] for r,c in group]) // len(group)
for r, c in group:
eggs[r][c] = egg
if stop:
break
answer += 1
print(answer)