Contents

EJERCICIO 6

Escribir una función recursiva para resolver el problema de la Torres de Hanoi y probarla para un valor 5 discos.

function hanoi
	num_max_discos=10; 		% Numero maximo de discos permitidos
    altura_disco=5; 			% altura de un disco
    ancho_disco=60; 			% grosor de un disco

    n=num_max_discos;
    while n>=num_max_discos
        n=input(strcat('cuantos discos existen (<',int2str(num_max_discos),'): '));
    end

    columna=[1:n;zeros(2,n)]; 		% Estado de la columnaumna
    disco=1:n; 			% Manejo del disco
    init(n);				% columnaumnas y discos de inicio
    move(n,1,3,2);			% starting moving
%init 3 columnaumns
% DIBUJADO DE DISCOS EN LA PRIMERA columnaUMNA
function init(n)
	figure('color','white');
	title('Torres de Hanoi','color',[.6 0 0])
	axis off;
	axis([0 800 0 100]);
	%DIBUJAR columnaUMNAS 1,2,3
	line([200 200],[0 50], 'LineWidth',2);
	line([400 400],[0 50], 'LineWidth',2);
	line([600 600],[0 50], 'LineWidth',2);
	%DIBUJADO DE DISCOS EN LA PRIMERA columnaUMNA
	for d=1:n
		disco(d)=rectangle('Position',[200-(n+1-d)*ancho_disco/2,(d-1)*altura_disco,(n+1-d)*ancho_disco,altura_disco],'facecolor','r');
	end
end
function move(n,c1,c3,c2)
	if n>0
		move(n-1,c1,c2,c3)
		move_a_disco(c1,c3)
		move(n-1,c2,c3,c1)
	end
end
%mover un disco desde el origen al destino
function move_a_disco(source,dest)
    % encuentra el disco superior en la fuente
	i=1;
      while i<=size(columna,2) && columna(source,i)>0
           i=i+1;
      end
      i=i-1;
    % sacar el disco de la fuente
      d=columna(source,i);
      columna(source,i)=0;
    % encuentra el disco superior
      j=1;
      while columna(dest,j)>0
          j=j+1;
      end
    % pone ese disco en ese lugar correpondiente
      columna(dest,j)=d;
% mueve el disco de la fuente al lugar

	% 1. arriba
	for t=altura_disco*(d-1):80
		set (disco(d),'Position',[200*source-(n+1-d)*ancho_disco/2,t,(n+1-d)*ancho_disco,altura_disco]);
            pause(.01);
	end

	% 2. derecha o izquierda
	set (disco(d),'Position',[200*dest-(n+1-d)*ancho_disco/2,altura_disco*(t-1),(n+1-d)*ancho_disco,altura_disco]);
	pause(.01);

 	% 3. abajo
	for t=80:-5:altura_disco*(j-1)
            set (disco(d),'Position',[200*dest-(n+1-d)*ancho_disco/2,t,(n+1-d)*ancho_disco,altura_disco]);
            pause(.01);
	end

    end   % move_a_disco

end    % hanoi function
Error using input
Cannot call INPUT from EVALC.

Error in ejercicio_6 (line 13)
        n=input(strcat('cuantos discos existen (<',int2str(num_max_discos),'): '));