[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [obm-l] Torre de Hanoi



Alamir,

Eu fiz este código há muito tempo, mas talvez ainda funcione. Hehehe

program TorreDeHanoi;
uses crt,extra,EXGRAPH,zentimer;

const Max=31;
type tpinos = array[1..Max,1..3] of integer;

var Pinos : tpinos;
    ndiscos : word;
    NTrocas : longint;

Procedure InicializaHanoi(npinos : word);
var i,j : integer;
begin
  clrscr;
  for i:=1 to Max do
   for j:=1 to 3 do  pinos[i,j]:=0;

  for i:=1 to npinos do pinos[npinos-i+1,1]:=i;
end;

procedure MostraHanoi;
var
    i,j : integer;
    x,y : integer;
    Largura : integer;
begin
  ClearPage(Vscreen,0);
  for i:=1 to Max do
   for j:=1 to 3 do
   begin
     Largura:=Pinos[i,j]*2;
     x:=((j-1)*100+50)-(largura div 2);
     y:=190-i*5;
     DrawButton(x,y,largura,4,false,'',Vscreen);
   end;
   setcolor(15);
   Font(100,1,'Torre de Hanoi',DefFont,Vscreen);
   Font(1,5,'Trocas: '+IntToStr(NTrocas),DefFont,Vscreen);
   Font(1,15,LZTimeToStr(LZTimerLap),DefFont,Vscreen);
   Font(150,190,'By [K]co - www.loopz.cjb.net',DefFont,Vscreen);
   Flip(Vscreen,VGA);
   {sound(8000+random(100)); delay(5); nosound;}
end;


procedure Hanoi(num, origem, dest, trab : integer);
var
  porigem, pdest : integer;
  i : integer;
begin
  if num<>0 then begin
    hanoi(num-1,origem,trab,dest);

    { move o pino }
    porigem:=1;
    while pinos[porigem,origem]<>0 do
      inc(porigem);
    Dec(porigem);
    pdest:=1;
    while pinos[pdest,dest]<>0 do
      inc(pdest);

    pinos[pdest,dest]:=pinos[porigem,origem];
    pinos[porigem,origem]:=0;
    Inc(Ntrocas);

    {if (pdest=1) then
    for i:=1 to 20 do begin
      sound(8000+random(100)); delay(5); nosound;
    end;}

    mostrahanoi;
    if not keypressed then
    hanoi(num-1,trab,dest,origem);

  end;
end;

var
    R,g,b : byte;
begin
  repeat
    clrscr;
    Write('N£mero de Discos: (Max 30) ');
    repeat
     Readln(ndiscos);
    until ndiscos<31;
    Init(true);
    inicializahanoi(ndiscos);
    mostrahanoi;
    NTrocas:=0;
    LZTimerOn;
    Hanoi(ndiscos,1,3,2);
    mostrahanoi;
    setcolor(14);
    Font(1,190,'ESC sai',DefFont,VGA);
    getpal(14,r,g,b);
    repeat
      r:=(r+1) mod 64;
      setpal(14,r,r,0);
    until keypressed;
    Finish;
  until Port[$60]=1;
end.


Alamir Rodrigues wrote:
Estou tentando implementar a torre de Hanoi em pascal, mas até agora só consegui chegar a metade do problema, alguém pode me ajudar?
 

program ex_hanoi2;

uses crt;

procedure hanoi2 (n:integer; a,b,c,d:char);

begin

  if n=2 then

    writeln('leve os discos 1 e 2 de ',a,' para ',d)

  else

    begin

      hanoi2(n-1,a,c,d,b);

      writeln('leve o disco ',n,' de ',a,' para ',d);

    end;

end;

var n:integer;

    a,b,c,d:char;

Begin

  clrscr;

  a:='a';b:='b';c:='c';d:='d';

  writeln('Entre com o n§ de elementos: ');

  readln(n);

  hanoi2(n,a,b,c,d);

  readkey;

End.

 

Os passos são:

 

- Leve 1 e 2 de A para C;

- Leve 3 de A para B;

- Leve 4 de A para D;

- Leve 3 de B para D;

- Leve 1 e 2 de C para D.

========================================================================= Instruções para entrar na lista, sair da lista e usar a lista em http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html =========================================================================