✅ 격자의 가운데 칸부터 토네이도의 이동이 시작
✅ 모래가 이미 있는 칸으로 모래가 이동하면, 모래의 양은 더해진다
✅ 모래가 격자의 밖으로 이동할 수도 있다.
✅ 토네이도가 소멸되었을 때, 격자의 밖으로 나간 모래의 양
가운데부터 회오리치듯 돌아서 (1,1)까지 나오게 된다. main
함수를 통해 구현했으며, 이동할 때마다 현재 칸의 모래의 양, 방향 등의 정보를 가지고 tornado
함수 실행
총 9칸에 대해서만 비율이 정해져 있고 남는 양은 알파(alpha
)로 이동하게 된다. 격자 밖으로 벗어나는 모래들에 대해서는 ans_sand
에 값을 저장
각 9칸에 대한 비율 정보가 dxy_lst
에 담겨 있기 때문에 9번 반복문을 돌며 각각의 칸에 대해 처리
import sys
input = sys.stdin.readline
# 토네이도 시전
def tornado(arr, d, y, x):
global total_sand, ans_sand
dy, dx = dir[d%4]
# 가로로 불 때와 세로로 불 때 처리
if dx == 0:
dxy_lst = (dy*2, 0), (dy, 1), (dy, -1), (dy*-1, 1), (dy*-1, -1), (0, -1), (0, 1), (0, -2), (0, 2)
else:
dxy_lst = (0, dx*2), (1, dx), (-1, dx), (1, dx*-1), (-1, dx*-1), (-1, 0), (1, 0), (-2, 0), (2, 0)
NOW_SAND = alpha = arr[y][x]
for i in range(9):
dyy, dxx = dxy_lst[i]
ny, nx = y+dyy, x+dxx
tmp = int(NOW_SAND * RATIO[i])
alpha -= tmp
if -1<ny<N and -1<nx<N:
arr[ny][nx] += tmp
else: ans_sand += tmp
if -1<y+dy<N and -1<x+dx<N:
arr[y+dy][x+dx] += alpha
else:
ans_sand += alpha
arr[y][x] = 0
def main():
x = y = N//2
u, v, d = 1, -1, 0
while 1:
if u == N:
break
for _ in range(u):
x += v
tornado(arr, d, y, x)
v *= -1
d += 1
for _ in range(u):
y += v
tornado(arr, d, y, x)
u += 1
d += 1
for _ in range(N-1):
x -= 1
tornado(arr, d, y, x)
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
dir = (0, -1), (1, 0), (0, 1), (-1, 0)
RATIO = [0.05, 0.1, 0.1, 0.01, 0.01, 0.07, 0.07, 0.02, 0.02]
ans_sand = 0
main()
print(ans_sand)