[伯俊15685]龍曲線


Link

質問する


ドラゴンカーブには、次の3つのアトリビュートがあります.
1.시작점 2.시작 방향 3.세대
第1世代龍曲線は、第0世代龍曲線を終点として時計回りに90度回転し、第0世代龍曲線の終点に貼り付けられます.

0から1 0までの線は0世代です0世代線1,0,時計回りに90回転すると、1,0点から1,-1の線が生まれ、ここにつながる線が1世代になります。


これらの規則に従って描かれた線は,これらの線の描画によって矩形を形成する個数がどれだけあるかが問題である.
  • 0:x座標が増加する方向(→)
  • 1:y座標が減少する方向(↑)
  • 2:x座標が減少する方向(←)
  • 3:y座標が増加する方向(↓)
  • 世代が増えるにつれて,大きさは元の2倍であり,かつ前世代をベースに回転していることがわかる.
    世代0:右側
    第1世代:0世代+前世代
    第2世代:第1世代+左+上
    .
    .
    .
    .
    方向は前世代に基づいていることがわかる.もう少し具体的に.
    「第1世代は、既存の0世代の方向+ビットを追加しました.」「上」はどうやって作ったのか、これがポイントです.
    第0世代の第2世代の最後の方向から第1の方向まで、反時計回りに回転する法則があります.
    世代0:右側
    第1世代:右側(0世代)+上部
    2代目:右+上(1代目)+左+上왼쪽+위쪽은 2세대의 위쪽 방향을 반시계 회전 왼쪽,오른쪽 방향을 반시계로 회전하여 위쪽이 만들어 진것이다.前世代によれば、反時計回りに回転して次世代を形成することができる. ✔사각형의 유무는 사각형의 각 꼭짓점의 배열의 칸 안에 표시하면 된다.
    このようにして直線を作成する場合は、各座標を頂点として、直線を描画し続けます.
    最後に配列のサイズで巡回すると
    i,j
    i+1,j
    i,j+1
    i+1,j+1
    これらがすべて本物であることを確認し、カウントすればいいです.
    package Thur_Sunday_aWeek_Al.SAMSUNG;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class dragonCurve {
      static int dx[]={0,-1,0,1};
      static int dy[]={1,0,-1,0};  // 오,위,왼,아래
      static int y,x,d,g;
      static boolean map[][]=new boolean[101][101];
      static ArrayList<Integer> direc;
      public static void main(String[] args) {
          Scanner sc=new Scanner(System.in);
          int n=sc.nextInt();
          for (int i = 0; i <n ; i++) {
              y=sc.nextInt();
              x=sc.nextInt();
              d=sc.nextInt();
              g=sc.nextInt();
              direc= new ArrayList<>();
              direc.add(d);
              curve(g);
              draw(x,y);
          }
          int cnt=0;
          for (int i = 0; i < 100; i++) {
              for (int j = 0; j < 100; j++) {
                  if(map[i][j] && map[i+1][j]&& map[i][j+1] && map[i+1][j+1])
                      cnt++;
              }
          }
          System.out.println(cnt);
    
      }
      static void draw(int x,int y)
      {
          map[x][y]=true;
          int nx=x;
          int ny=y;
    
          for (int i = 0; i < direc.size(); i++) {
              int d=direc.get(i);
              nx+=dx[d];
              ny+=dy[d];
              map[nx][ny]=true;
          }
      }
    
      private static void curve(int genertaions) {
          for (int i = 0; i < genertaions; i++) { // 몇세대 까지 그려라.
              int size=direc.size();
              for (int j = size-1; j >=0 ; j--) {
                  direc.add((direc.get(j)+1)%4);
              }
          }
    
      }
    }