Program P44_69; {Parag. 3}
{--------------------------------------------------------------
    Se da numarul natural n >= 20.
    Sa se afiseze numerele 1, 2, ..., n conform skemei.
     _________
    | _______     Exemplu: n=20
    || _____ |
    ||| ___ ||     20  7  8  9 10
    |||____|||     19  6  1  2 11
    ||______||     18  5  4  3 12
    |________|     17 16 15 14 13
 --------------------------------------------------------------}

uses crt;
var n, m, x, y, i, u, d: integer;
begin
  TextMode(258); {Modul textual 80x50}
  Writeln;
  Writeln('Scrie un nr natural >= 20: ');
  readln(n);
  clrscr;
  if n < 20 then Exit;
  x := 1; {Cate numere sa scriu pe orizontala}
  y := 1; {Cate numere sa scriu pe verticala}
  m := 1; {Variabila contor (1 -> n) }
  d := trunc(ln(n)/ln(10)+1)+1; {Nr de cifre din n, +1}

  GoToXY(Lo(WindMax) div 2 - d, Hi(WindMax) div 2); {centrul ecranului}
  write(m:d); {Scriem "1"}

  while m < n do begin

    if x mod 2 = 0 then u := -1 else u := 1; {u indica directia de parcurgere + sau -}
    {x - par   => miscarea la stanga;
     x - impar => miscarea la dreapta}
    if n-m < x then x := n-m;
    for i := 1 to x do begin
      inc(m);                           {Urmatorul numar}
      GoToXY(WhereX - d + u*d, WhereY); {Pozitia urmatorului numar pe ecran}
      Write(m:d);                       {Afisarea numarului}
    end;
    inc(x);

    if y mod 2 = 0 then u := -1 else u := 1; {u indica directia de parcurgere + sau -}
    {y - par   => miscarea in sus;
     y - impar => miscarea in jos}
    if n-m < y then y := n-m;
    for i := 1 to y do begin
      inc(m);
      GoToXY(WhereX - d, WhereY + u*2); {m se scrie pe d caractere, de aceea cursorul se plaseaza WhereX - d}
      Write(m:d);
    end;
    inc(y);

  end;

  readkey
end.
