import sys
def rotate_90_degree_and_add(a, end_pos):
cur_x, cur_y = end_pos[0], end_pos[1]
n = len(a)
m = len(a[0])
result = [[0] * n for _ in range(m)]
for i in range(n):
for j in range(m):
if a[i][j] == 9:
next_x, next_y = j, n - 1 - i
result[j][n - 1 - i] = a[i][j]
move = [cur_x - next_x, cur_y - next_y]
for i in range(n):
for j in range(m):
if result[i][j] == 1:
nx = i + move[0]
ny = j + move[1]
a[nx][ny] = 9
next_end = (nx, ny)
continue
if result[i][j] != 0:
nx = i + move[0]
ny = j + move[1]
a[nx][ny] = result[i][j]
# end 점 2로 수정
a[cur_x][cur_y] = 2
return a, next_end
def make(start_x, start_y, dir, gen):
if dir == 0:
end = (start_x, start_y + 1)
elif dir == 1:
end = (start_x - 1, start_y)
elif dir == 2:
end = (start_x, start_y - 1)
else:
end = (start_x + 1, start_y)
# 초기값
graph = [[0] * 101 for _ in range(101)]
graph[start_x][start_y] = 1
graph[end[0]][end[1]] = 9
if gen == 0:
for i in range(len(graph)):
for j in range(len(graph)):
if graph[i][j] != 0:
answer[i][j] = 1
else:
for _ in range(gen):
graph, end = rotate_90_degree_and_add(graph, end)
for i in range(len(graph)):
for j in range(len(graph)):
if graph[i][j] != 0:
answer[i][j] = 1
answer = [[0] * 101 for _ in range(101)]
n = int(input())
for _ in range(n):
y, x, d, g = map(int, sys.stdin.readline().rstrip().split())
make(x, y, d, g)
cnt = 0
for i in range(0, len(answer) - 1):
for j in range(0, len(answer) - 1):
if answer[i][j] == answer[i+1][j] == answer[i][j+1] == answer[i+1][j+1] == 1:
cnt += 1
print(cnt)
import sys
"""
https://www.acmicpc.net/problem/15685
0: x 좌표가 증가하는 방향 (→)
1: y 좌표가 감소하는 방향 (↑)
2: x 좌표가 감소하는 방향 (←)
3: y 좌표가 증가하는 방향 (↓)
주어진 예시를 방향을 나타내는 숫자를 사용하여 규칙을 찾아내는 풀이
ex)
1
4 2 1 3
[1, 2, 3, 2, 3, 0, 3, 2]
"""
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
n = int(input())
graph = [[0] * 101 for _ in range(101)]
for _ in range(n):
y, x, d, g = map(int, sys.stdin.readline().rstrip().split())
dir = [d]
graph[x][y] = 1
for _ in range(g):
add = []
for i in range(len(dir) - 1, -1, -1):
add.append((dir[i] + 1) % 4)
dir.extend(add)
for i in dir:
x += dx[i]
y += dy[i]
graph[x][y] = 1
cnt = 0
for i in range(0, len(graph) - 1):
for j in range(0, len(graph) - 1):
if graph[i][j] == graph[i + 1][j] == graph[i][j + 1] == graph[i + 1][j + 1] == 1:
cnt += 1
print(cnt)
예전에 풀었던 문제중에 배열을 90도 회전하는 문제가 생각나서 무작정 구현해서 풀었다. 풀면서도 풀이가 지저분해서 맞는가 싶었는데 방향의 규칙을 이용한 풀이가 존재해서 읽고 다시 풀어봤다.