알고리즘
[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)