Você está na página 1de 7

El algoritmo resuelve el problema de mover n discos poniendol en funcin de la

resolucin del problema (ms sencillo) de mover n-1 discos. El siguiente procedimiento
muestra la solucin imprimiendo una serie de lineas que indican el disco que hay que
mover en cada momento (se supone que los postes se identifican por un carcter):
procedure Hanoi3(N: integer; Orig,Dest,Aux: char);
begin
if N = 1 then
writeln(output,Orig,' -> ',Dest)
else
begin
Hanoi3(N-1,Orig,Aux,Dest);
writeln(output,Orig,' -> ',Dest);
Hanoi3(N-1,Aux,Dest,Orig)
end
end;

Utilizando recursividad se obtiene una solucin muy simple pero que


sorprendentemente funciona:
import java.util.*;
public class Hanoi {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;

System.out.println("Numero de discos: ");


n = sc.nextInt();
Hanoi(n,1,2,3); //1:origen 2:auxiliar 3:destino
}

public static void hanoi(int cantidad, char torre_inicio, char torre_ayuda, char torre_desti
no){
if(cantidad == 1) // caso base en el que solo hay un disco para mover
System.out.println("Mover de " + torre_inicio + " a " + torre_destino );
else{
hanoi(cantidad-1, torre_inicio, torre_destino, torre_ayuda); // movemos todos los
discos menos el de abajo hacia la torre de ayuda
System.out.println("Mover de " + torre_inicio + " a " + torre_destino ); //movemos
el disco restante
hanoi(cantidad-1, torre_ayuda, torre_inicio, torre_destino); //movemos el resto d
e discos desde la torre de ayuda a la torre de destino
}

FORMA RECURSIVA
hanoi ( N, origen, destino, auxiliar )
{
si N mayor a 0 entonces
hanoi(N - 1, origen, auxiliar, destino)
pasar disco N de origen a destino
hanoi(N - 1, auxiliar, destino, origen)
fin-si
}
PROGRAMACION EN JAVA
import java.io.*;
/**
* Imprime un sistema de posiciones para resolver
* las torres de hanoi tomando como referencia
* el elemento mas a la izquierda
*/
public class hanoi
{
static int moves=0; //cantidad de movimientos
static int getInt()
{
String line;
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
try
{
line = in.readLine();
int i = Integer.valueOf(line).intValue();
return i;
}

catch (Exception e)
{
System.err.println("Digite un numero valido.\n" +
"se asume como el valor de 1");
return 1;
}
}
*/Funcion para mover disco de torre a torre*/
static void hanoi(int altura, char deTorre, char aTorre, char conTorre)
{
if (altura >= 1)
{
hanoi(altura-1, deTorre, conTorre, aTorre);
moverDisco(deTorre, aTorre);
hanoi(altura-1, conTorre, aTorre, deTorre);
}
}
/*funcion para imprimir el movimiento del disco*/
static void moverDisco(char deTorre, char aTorre)
{
moves++;
System.out.print(deTorre);
System.out.print(aTorre);
System.out.print(((moves % 20)==0) ? '\n' : ' ');
}
*/Funcion para Ingresar la cantidad de discos*/
public static void main(String[] args)
{
int AlturaTorre;
char deTorre='A', aTorre='B', conTorre='C';
System.out.println("Digite Cantidad de discos");
System.out.print("y presione Enter");
System.out.print (" ");
AlturaTorre = getInt();
hanoi(AlturaTorre, deTorre, aTorre, conTorre);
System.out.println();
}

var tower1 = [], tower2 = [], tower3 = [];

var n = 5; // Numero de discos

3
4

// Coloca en orden n discos en tower1

initTowers();

show(); // Estado inicial de las torres

hanoi(n, tower1, tower2, tower3);

show(); // Estado final de las torres

9
10

function hanoi(n, ori, aux, des) {

11

// El caso base es mover 1 disco de ori a des

12

if(n === 1)

13

mov(ori, des);

14

else {

15

// Se mueven n-1 discos de ori a aux

16

hanoi(n - 1, ori, des, aux);

17

mov(ori, des);

18

// Se mueven n-1 discos de aux a des

19

hanoi(n - 1, aux, ori, des);

20

21

22

// Se mueve un disco de la torre ori a des

23

function mov(ori, des) {

24

des.push(ori.pop());

25

26

function initTowers() {

27

for(var i = 0; i < n; i++)

28

tower1.push(n - i);

29

30

function show() {

31

console.log(tower1);

32

console.log(tower2);

33

console.log(tower3);

34

console.log();

35

//Mtodo Torres de Hanoi Recursivo


public static void Hanoi(int n, int origen, int auxiliar, int destino){
if(n==1)
System.out.println("mover disco de " + origen + " a " + destino);
else{
Hanoi(n-1, origen, destino, auxiliar);
System.out.println("mover disco de "+ origen + " a " + destino);
Hanoi(n-1, auxiliar, origen, destino);
}
}
}

Você também pode gostar