21611 백준 마법사 상어와 블리자드

Kim Jio·2023년 1월 9일
0

https://www.acmicpc.net/problem/21611

  1. 마법 실행
  2. 마법 실행으로 없어진 구슬 칸에 차곡차곡 쌓인다
  3. 4개 이상 같은 구슬로 이루어져 있다면 파괴된다
  4. 구슬은 다시 차곡차곡 쌓인다
  5. 3 ~ 4번이 상호작용이 없을 때 까지 반복된다
  6. 구슬은 변화한다 (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()
profile
what's important is an unbreakable heart

0개의 댓글