https://www.acmicpc.net/problem/21611
- 마법 실행
- 마법 실행으로 없어진 구슬 칸에 차곡차곡 쌓인다
- 4개 이상 같은 구슬로 이루어져 있다면 파괴된다
- 구슬은 다시 차곡차곡 쌓인다
- 3 ~ 4번이 상호작용이 없을 때 까지 반복된다
- 구슬은 변화한다 (1 ~ 3개 구슬)-> (구슬의 개수) (구슬의 번호)
import math
dir = [[], [-1, 0], [1, 0], [0, -1], [0, 1]]
tor = [[0, -1], [1, 0], [0, 1], [-1, 0]]
oneD = 0
twoD = 0
thrD = 0
N = 0
def Des(n, things):
global oneD
global twoD
global thrD
if n == 1:
oneD += things
if n == 2:
twoD += things
if n == 3:
thrD += things
def move(arr):
global N
tmp = []
midX = math.floor(N / 2)
midY = math.floor(N / 2)
dc = 0
# 구슬 이동
cnt = 0
move = 1
flag = True
while flag:
s = move
while s:
midX += tor[dc][0]
midY += tor[dc][1]
if arr[midX][midY] == 0:
return tmp
if midX < 0 or midY < 0:
flag = False
break
s -= 1
if arr[midX][midY] != -1:
tmp.append(arr[midX][midY])
cnt += 1
# 방향 전환
if dc == 3:
dc = 0
else:
dc += 1
# 속도 전환
if cnt == 2:
move += 1
cnt = 0
return tmp
def record(arr, rst):
global N
l = len(rst)
midX = math.floor(N / 2)
midY = math.floor(N / 2)
idx = 0
dc = 0
# 구슬 이동
cnt = 0
move = 1
while idx < l:
s = move
while s:
midX += tor[dc][0]
midY += tor[dc][1]
if idx == l:
return arr
s -= 1
arr[midX][midY] = rst[idx]
idx += 1
cnt += 1
# 방향 전환
if dc == 3:
dc = 0
else:
dc += 1
# 속도 전환
if cnt == 2:
move += 1
cnt = 0
return arr
def change(arr):
tmp = []
stack = []
for i in range(len(arr)):
if len(stack) == 0:
stack.append(arr[i])
continue
if(arr[i] == 0):
break
if stack[-1] != arr[i]:
tmp.append(len(stack))
tmp.append(stack[-1])
stack = [arr[i]]
else:
stack.append(arr[i])
if len(stack) != 0:
tmp.append(len(stack))
tmp.append(stack[-1])
return tmp
def Main():
global N;
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
while M:
d, s = map(int, input().split())
M -= 1
midX = math.floor(N / 2)
midY = math.floor(N / 2)
distroy = 0
# 파괴 단계
for _ in range(s):
midX += dir[d][0]
midY += dir[d][1]
arr[midX][midY] = -1
distroy += 1
# 상호작용단계
while distroy:
distroy = 0
# 이동
tmp = move(arr)
# 구슬 폭파 (tmp 순회)
stack = []
rst = []
for i in range(len(tmp)):
if tmp[i] == 0:
break
if len(stack) == 0:
stack.append(tmp[i])
continue
if stack[-1] != tmp[i]:
if len(stack) > 3:
number = stack[-1]
distroy += len(stack)
Des(number, len(stack))
stack = [tmp[i]]
else:
rst.extend(stack)
stack = [tmp[i]]
else:
stack.append(tmp[i])
if len(stack) > 3:
number = stack[-1]
distroy += len(stack)
Des(number, len(stack))
else:
rst.extend(stack)
arr = [[0 for _ in range(N)] for _ in range(N)]
arr = record(arr, rst)
# 변화 단계
chL = move(arr)
if len(chL) == 0:
break
chL = change(chL)
arr = [[0 for _ in range(N)] for _ in range(N)]
arr = record(arr, chL[:N*N - 1])
print(oneD + twoD * 2 + thrD * 3)
#
if __name__ == '__main__':
Main()