https://www.acmicpc.net/problem/15685
"""
"""
from sys import stdin
input = stdin.readline
n = int(input())
pan = [ [0] * (100+1) for _ in range(100+1) ] # 크기가 100×100인 격자 위에 드래곤 커브가 N개 있다.
answer = 0
def search_square(): # 네 꼭짓점이 드래콘 커브의 일부인것의 개수를 세는 함수
global answer
for i in range(100): # +1씩 해서 4방향으로 탐색하기 때문에 생성한 100+1*100+1이 아닌 100*100으로 탐색한다.
for j in range(100):
if pan[i][j] == 1 and pan[i+1][j] == 1 and pan[i][j+1] == 1 and pan[i+1][j+1] == 1:
answer += 1
dx, dy = [0, -1, 0, 1], [1, 0, -1, 0] # 동, 북, 서, 남
for _ in range(n):
# x, y를 바꿔서 입력받은 이유는 문제 자체에서 x, y을 바꿔서 줬기 때문임.
y, x, d, g = map(int, input().split()) # x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대
pan[x][y] = 1
curve = [d]
for i in range(g):
for k in range(len(curve)-1, -1, -1): # 가장 최근 회전한것 부터 회전방향을 바꿔준다.
curve.append((curve[k] + 1) % 4) # 0:동, 1:북, 2:서, 3:남
for k in range(len(curve)): # 회전 방향을 기록해놓은 대로 전진하면서 좌표를 업데이트 해준다.
x += dx[curve[k]]
y += dy[curve[k]]
pan[x][y] = 1
search_square()
print(answer)
0세대, 1세대, 2세대 세대가 올라갈수록 회전 방향이 바뀌게 된다.
이 회전방향의 규칙을 찾아야 하는데 처음이 만약 d=0, 즉 동쪽으로 간다고 한다면 그 다음은 시계방향으로 90도 회전한 북쪽방향, 그 다음은 서쪽방향을 거쳐 북쪽방향으로 가게 된다.
회전방향을 리스트로 나타내면
0세대 드래곤 커브 = [0]
1세대 드래곤 커브 = [0, 1]
2세대 드래곤 커브 = [0, 1, 2, 1] 이된다. (동쪽:0, 북쪽:1, 서쪽:2, 남쪽:3)
2세대 드래곤 커브에서 인덱스2의 2는 인덱스1에 +1한 값이고(북쪽에서 서쪽으로 변경), 인덱스3의 1은 인덱스0에 +1한 값이다(서쪽에서 북쪽으로 변경). 즉 최근에 회전된 것부터 +1을 하면서 회전방향을 바꿔준 것이다.