{
    Vyriesi problem HANOJSKYCH VEZI (rekurzivnym algoritmom+animacia :-D)
    Pozn. autora: Ja viem ze to ma chyby a nie je to optimalne. Ale
                  komu sa s tym chce bavit? :)
    
    Copyright (C) 2003 Andrej Krutak

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 

}
program hanojske_veze;

uses crt;

const max_poloziek=13;
      pre_poloziek=13;
      x_size=26;
      x_offset=15;
      y_offset=4;
      DELAY_TIME=0;

var veze: array[1..3, 1..max_poloziek] of integer;
    i, j, k, l: integer;

procedure draw;
begin
     for i:=1 to 3 do begin
         textcolor(white);
         for j:=1 to max_poloziek do begin
             gotoxy((i-1)*x_size+x_offset, j+y_offset);
             write('|');
         end;
         for j:=1 to max_poloziek do begin
             gotoxy((i-1)*x_size+x_offset - veze[i, j] div 2, max_poloziek-j+1+y_offset);
             textcolor(veze[i, j] mod 16);
             for k:=1 to veze[i, j] do
                 write('=');
         end;
     end;
end;

procedure presun_do(odkial, kam: integer);
var a, b, t:integer;
begin
     i:=1;
     while (veze[odkial, i]<>0) do
           i:=i+1;
     i:=i-1;
     if (i<1) then begin writeln('WHAT THE F***?'); readkey; end;

     j:=1;
     while (veze[kam, j]<>0) do
           j:=j+1;
     if (j>1) and (veze[kam, j-1]<veze[odkial, i]) then begin writeln('WHAT THE F***?'); readkey; end;

     {gotoxy((odkial-1)*x_size+x_offset - x_size div 2, max_poloziek-i+1+y_offset);
     for k:=1 to x_size do
         write(' ');}

     textcolor(white);
     gotoxy((odkial-1)*x_size+x_offset, max_poloziek+y_offset+3);
     write('+');
     gotoxy((kam-1)*x_size+x_offset, max_poloziek+y_offset+3);
     write('+');
     a:=(odkial-1)*x_size+x_offset;
     b:=(kam-1)*x_size+x_offset;
     if (a>b) then begin t:=a; a:=b; b:=t; t:=a+1; end else t:=b+1;
     a:=a+1;
     b:=b-1;
     for k:=a to b do begin
         gotoxy(k, max_poloziek+y_offset+3);
         write('-');
     end;

     gotoxy((b-a) div 2 + a-2, max_poloziek+y_offset+3);
     if (t=a) then
        write('<-<-<')
     else write('>->->');

     {animate up}
     for k:=i to max_poloziek+2 do begin
         gotoxy((odkial-1)*x_size+x_offset - veze[odkial, i] div 2, max_poloziek-k+1+y_offset);
         textcolor(veze[odkial, i] mod 16);
         for l:=1 to veze[odkial, i] do
             write('=');

         if (k<>i) then begin
            gotoxy((odkial-1)*x_size+x_offset - x_size div 2, max_poloziek-k+1+y_offset+1);
            for l:=1 to x_size do
                write(' ');
         end;

         if (k<(max_poloziek+2)) and (k<>1) and (k<>i) then begin
            gotoxy((odkial-1)*x_size+x_offset, max_poloziek-k+1+y_offset+1);
            textcolor(white);
            write('|');
         end;

         delay(DELAY_TIME);
     end;

     {erase}
     gotoxy((odkial-1)*x_size+x_offset - x_size div 2, -2+1+y_offset);
     for l:=1 to x_size do
         write(' ');

     {move sideways, nechocetsja ;-) }

     {animate up}
     for k:=max_poloziek+2 downto j do begin
         gotoxy((kam-1)*x_size+x_offset - x_size div 2, max_poloziek-k+1+y_offset-1);
         for l:=1 to x_size do
              write(' ');

         if (k<max_poloziek) then begin
            gotoxy((kam-1)*x_size+x_offset, max_poloziek-k+1+y_offset-1);
            textcolor(white);
            write('|');
         end;

         gotoxy((kam-1)*x_size+x_offset - veze[odkial, i] div 2, max_poloziek-k+1+y_offset);
         textcolor(veze[odkial, i] mod 16);
         for l:=1 to veze[odkial, i] do
             write('=');

         delay(DELAY_TIME);
     end;

     textcolor(white);
     gotoxy(1, max_poloziek+y_offset+3);
     write('                                                                             ');

     veze[kam, j]:=veze[odkial, i];
     veze[odkial, i]:=0;
     {draw;}
end;

procedure presun(n, odkial, kam, pom: integer);
begin
     if n=1 then presun_do(odkial, kam)
            else begin
                 presun(n-1, odkial, pom, kam);
                 presun(1, odkial, kam, pom);
                 presun(n-1, pom, kam, odkial);
            end;
end;

procedure ries;
begin
     presun(pre_poloziek,1,2,3);
end;

begin
     clrscr;
     for i:=1 to 3 do
         for j:=1 to max_poloziek do
             veze[i][j]:=0;

     for i:=1 to pre_poloziek do
         veze[1, i]:=(pre_poloziek-i)*2+1;

     draw;

     textcolor(white);
     gotoxy(20, 25);
     write('hANOJSKE vEZE aNiMATED (C)2003 AndreK :)');

     ries;

     readkey;
end.