import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Dragon_Curve {
static int[] dr = {0,-1,0,1};
static int[] dc = {1,0,-1,0};
static boolean[][]map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int count =0;
map = new boolean[101][101];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int col = Integer.parseInt(st.nextToken());
int row = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
int g = Integer.parseInt(st.nextToken());
map[row][col] = true;
curveDir(col,row,dir,g);
}
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
if(map[i][j]&&map[i][j+1]&&map[i+1][j+1] &&map[i+1][j])
count++;
}
}
System.out.println(count);
}
public static void curveDir(int col, int row, int dir, int g){
List<Integer> list = new ArrayList<>();
list.add(dir);
for (int i = 1; i < g+1; i++) {
for (int j = list.size()-1; j >=0 ; j--) {
list.add((list.get(j)+1)%4);
}
}
for(int i: list){
col +=dc[i];
row +=dr[i];
map[row][col]=true;
}
}
}
📢 이 풀이의 핵심은 3세대 드래곤 커브의 동작에서 규칙을 찾아내는게 핵심이다.
전 세대의 커브를 시계방향 회전시켜서 이어 붙이면 다음 세대 드래곤 커브가 된다.
※이때 커브자체는 시계방향 회전이지만, 각각의 선분 방향의 회전만 놓고 본다면 반시계방향으로 돌고 있다.
나는 규칙을 못찾았다. 진짜 진짜진짜 폼 좋은날이었으면 보였을거 같기도 한데 너무 아쉽다. 이런건 어떻게 생각하고 만드는걸까. 뭔가 수학 경시대회 하는거 같다.