[ Foro de Pascal ]

Torres de Hanoi

19-Apr-2013 10:21
Invitado (rubenciiin)
1 Respuestas

Hola, ya conseguí hacer el objeto árbol ahora tengo que hacer el programa de las torres de Hanoi, tengo todo solo me falta el procedure que hace mover los discos el código es el siguiente:


Program TorresDeHanoi;

uses crt;
const max = 9;
type torres = array[1..3,1..max] of byte;

var mov : integer; 

procedure pintavacio;
  begin
    textbackground(blue);
    textcolor(white);
    clrscr; clrscr; write(' ');
    write('Movimiento número: ',mov);
    textbackground(green );
    window (16,3,16,21); clrscr; 
    window (41,3,41,21); clrscr; 
    window (66,3,66,21); clrscr; 
    window (6,22,77,22); clrscr; 
    textbackground(blue);
  end;

procedure pintaTorres(t:torres);
var i,j,inix,iniy,inc : byte;
  begin
    pintavacio;
    textbackground(red);
    for i := 1 to 3 do
      for j := 1 to max do
        if t[i,j] > 0 then begin
                             inix := 16+25*(i-1)-t[i,j];
                             iniy := 22-2*j;
                             inc  := t[i,j] * 2 + 1;
                             window(inix,iniy,inix+inc,iniy);
                             clrscr;
                           end;
    textbackground(blue);
    window(1,1,80,25);  gotoxy(1,1);
    gotoxy(6,23); write('Pulsa una tecla para continuar...');
    readkey;
  end;

procedure mueve(var t:torres;ori,fin:byte);
var aux,top : byte;
  begin
	inc(mov);
	top:=max;
  end;

PROCEDURE Hanoi (n,A,B,C : byte;var t:torres);
  BEGIN
    IF n = 1 THEN mueve(t,A,C)
             ELSE BEGIN
                    Hanoi(n-1,A,C,B,t);
                    mueve(t,A,C);
                    Hanoi(n-1,B,A,C,t);
                  END;
  END;

procedure initorres(var t:torres;n:byte);
var i : byte;
  begin
    for i := 1 to max do
      begin
        if i <= n then t[1,i] := n+1-i
                  else t[1,i] := 0;
        t[2,i] := 0;
        t[3,i] := 0;
      end;
  end;

var num : byte;
var t   : torres;
begin
  mov := 0;
  clrscr;
  write('Dime cuantos discos tienes: '); readln(num);
  iniTorres(t,num);
  pintatorres(t);
  Hanoi(num,1,2,3,t);
end.




Un saludo y gracias.


21-Apr-2013 00:34
Nacho Cabanes (+83)

Te falta justo lo importante. Tienes los "adornos", pero no la función que resuelve el programa de las torres de Hanoi, que es típicamente una función que recursiva, que mueve de una columna a otro usando una tercera columna auxiliar.

Lee con cuidado el algoritmo, que puedes encontrar incluso en la wikipedia: el truco está en que entre una llamada y la siguiente intercambias la columna que actúa como origen y la auxiliar:

http://es.wikipedia.org/wiki/Torres_de_Han%C3%B3i






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)