TIL
백준 21610 마법사 상어와 비바라기
life_is_dumpling
2021. 9. 21. 13:42
문제
https://www.acmicpc.net/problem/21610
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
마법사 상어와 파이어 볼을 풀고 심심해서 풀어봤는데, 단순한 구현 문제였다. 문제에서 말하는 조건만 잘 지키면 된다.
파이어 볼 때랑 비슷하게 체크해야 될 부분은 N행 또는 N열을 넘으면 다시 첫번째 열과 행으로 올 수 있으니까 나머지를 계산해서 바꿔 주면 된다.
소스코드
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
dy = [0, -1, -1, -1, 0, 1, 1, 1]
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
di_y = [-1, -1, 1, 1]
di_x = [-1, 1, 1, -1]
cloud = []
arr = [[0 for _ in range(N)] for _ in range(N)]
for i in range(N):
arr[i] = list(map(int, input().split()))
cmd = []
for _ in range(M):
d, len = map(int, input().split())
cmd.append([d-1, len])
cloud.append([N-1, 0])
cloud.append([N-1, 1])
cloud.append([N-2, 0])
cloud.append([N-2, 1])
for dir in range(M):
ch = [[0]*N for _ in range(N)]
moved = []
while cloud:
y, x = cloud.pop(0)
yy = (y+dy[cmd[dir][0]]*cmd[dir][1]) % N
xx = (x+dx[cmd[dir][0]]*cmd[dir][1]) % N
ch[yy][xx] = 1
arr[yy][xx] += 1
moved.append([yy, xx])
for mv in moved:
y = mv[0]
x = mv[1]
for d in range(4):
yy = y+di_y[d]
xx = x+di_x[d]
if yy < 0 or xx < 0 or yy >= N or xx >= N:
continue
if arr[yy][xx] != 0:
arr[y][x] += 1
for i in range(N):
for j in range(N):
if ch[i][j] != 1 and arr[i][j] >= 2:
cloud.append([i, j])
arr[i][j] -= 2
ans = 0
for i in range(N):
for j in range(N):
ans += arr[i][j]
print(ans)