흙금이네 블로그

[BOJ] 20057 - 마법사 상어와 토네이도 (Python) 본문

알고리즘

[BOJ] 20057 - 마법사 상어와 토네이도 (Python)

흙금 2023. 3. 24. 13:51

 

 

아이디어

 

토네이도 이동 방향에 따른 변위 값과 이동 모래 비율들을 저장하고 토네이도를 구현한다.

 

 

풀이

 

import sys

input = sys.stdin.readline

delta = [(0, -1), (1, 0), (0, 1), (-1, 0)]
move = [
    [(-1, 0), (1, 0), (-1, -1), (1, -1), (-1, 1), (1, 1), (-2, 0), (2, 0), (0, -2)],
    [(0, -1), (0, 1), (1, -1), (1, 1), (-1, -1), (-1, 1), (0, -2), (0, 2), (2, 0)],
    [(-1, 0), (1, 0), (-1, 1), (1, 1), (-1, -1), (1, -1), (-2, 0), (2, 0), (0, 2)],
    [(0, -1), (0, 1), (-1, -1), (-1, 1), (1, -1), (1, 1), (0, -2), (0, 2), (-2, 0)]
]
P = [7, 7, 10, 10, 1, 1, 2, 2, 5]

def tornado(r, c, d):
    global res
    temp = 0
    for i in range(9):
        dr, dc = move[d][i]
        nr, nc = r+dr, c+dc
        if N > nr >= 0 and N > nc >= 0:
            sand[nr][nc] += sand[r][c]*P[i]//100
        else:
            res += sand[r][c]*P[i]//100
        temp += sand[r][c]*P[i]//100
    dr, dc = delta[d]
    nr, nc = r+dr, c+dc
    if N > nr >= 0 and N > nc >= 0:
        sand[nr][nc] += sand[r][c]-temp
    else:
        res += sand[r][c]-temp
    sand[r][c] = 0

N = int(input())
sand = [list(map(int, input().split())) for _ in range(N)]
res = 0
r = c = N//2
for k in range(1, N, 2):
    for _ in range(k):
        c -= 1
        tornado(r, c, 0)
    for _ in range(k):
        r += 1
        tornado(r, c, 1)
    for _ in range(k+1):
        c += 1
        tornado(r, c, 2)
    for _ in range(k+1):
        r -= 1
        tornado(r, c, 3)
for _ in range(N-1):
    c -= 1
    tornado(r, c, 0)
print(res)

 

Comments