program kvadratine_koch_sala;
  uses graph; { vartosime modul¨ graph }

  procedure piesti (n: integer);

     procedure koch (x1, y1, x2, y2, n: integer);
     { Rekursin‚ proced–ra, pie˛ianti n-ojo laipsnio Koch salos kreiv‚s dal¨:
       atkarpa jungianti ta˛kus (x1, y1) ir (x2, y2) pakei‡iama lau‘te }
        var dx, dy: integer;
     begin
       if n = 1
          then line (x1, y1, x2 ,y2)
       else begin
         { atkarp… kei‡iant lau‘te, atkarpa padalijama ¨ keturias dalis }
         { apsaki‡iuojame trumpiausios lau‘t‚s atkarpos ilg¨ }
         dx := (x2 - x1) div 4;
         dy := (y2 - y1) div 4;
         { atkarp… kei‡iame lau‘te i˛ septyni— atkarp— }
         Koch (x1,         y1,         x1+dx,      y1+dy,      n-1);
         Koch (x1+dx,      y1+dy,      x1+dx+dy,   y1+dy-dx,   n-1);
         Koch (x1+dx+dy,   y1+dy-dx,   x1+2*dx+dy, y1+2*dy-dx, n-1);
         Koch (x1+2*dx+dy, y1+2*dy-dx, x1+2*dx-dy, y1+2*dy+dx, n-1);
         Koch (x1+2*dx-dy, y1+2*dy+dx, x1+3*dx-dy, y1+3*dy+dx, n-1);
         Koch (x1+3*dx-dy, y1+3*dy+dx, x1+3*dx,    y1+3*dy,    n-1);
         Koch (x1+3*dx,    y1+3*dy,    x2,         y2,         n-1);
       end;
     end; { koch }

    var cx, cy: integer;
  begin
    cx := GetMaxX div 2; { gauname ekrano centro koordinates }
    cy := GetMaxY div 2;
    { pie˛iame kiekvien… i˛ keturi— kreiv‚s dali— }
    Koch (cx-cy div 2, cy div 2,      cx+cy div 2, cy div 2,      n);
    Koch (cx+cy div 2, cy div 2,      cx+cy div 2, cy + cy div 2, n);
    Koch (cx+cy div 2, cy + cy div 2, cx-cy div 2, cy + cy div 2, n);
    Koch (cx-cy div 2, cy + cy div 2, cx-cy div 2, cy div 2,      n);
  end; { pie˛ti }

var n,          { kreiv‚s laipsnis }
    tvarkykle,  { grafin‚s plok˛t‚s tvarkykl‚ }
    rezimas: integer; { grafinis rezimas }
begin
  readln (n); { ¨vedamas kreiv‚s laipsnis }
  { automati˛kai nustatoma grafin‚s plok˛t‚s tvarkykl‚ }
  tvarkykle := detect;
  { inicializuojamas grafinis rezimas }
  InitGraph (tvarkykle, rezimas,'');
  piesti (n);  { pie˛iama }
  readln;
  CloseGraph;  { gr¨‘tama ¨ tekstin¨ re‘im… }
end.
