class Hanoy {
// Las 3 pilas de discos
private Stack
// Constructor, toma el nº de fichas total
public Hanoy(int fichas) {
columnas = new Stack[3];
// Inicializamos las columnas vacias
columnas[0] = new Stack
columnas[1] = new Stack
columnas[2] = new Stack
// Colocamos en la primera las fichas, de mayor a menor
for (int i=fichas;i>0;i--) columnas[0].push(i);
}
// Muestra el estado actual
public void Mostrar() {
for (int i=0;i<3;i++) {
System.out.print("Col. "+i+": ");
for(int n : columnas[i]) System.out.print("["+n+"]");
System.out.println("");
}
}
// Mueve de la columna origen a la columna destino 1 disco
public void Mover(int origen, int destino) {
// Mostramos en pantalla lo que hacemos
Mostrar();
System.out.println("Movemos desde ("+origen+") hasta ("+destino+")");
System.out.println("");
// Y luego, lo hacemos, claro
columnas[destino].push(columnas[origen].pop());
}
// Mueve de la columna origen a la columna destino varios discos
public void MoverN(int origen, int destino, int cuantas) {
// Si solo es uno, se mueve sin más
if (cuantas <= 1) Mover(origen,destino);
else {
// Si son varios, entonces:
// - Primero movemos N-1 a la columna ni origen ni destino
MoverN(origen,3 - (origen+destino),cuantas-1);
// - Movemos la N, es decir, la grande
Mover(origen,destino);
// - Movemos las N-1 del primer paso, a la col. destino
MoverN(3 - (origen+destino),destino,cuantas-1);
}
}
// Programa principal
public static void main(String args[]) {
// Creamos una partida de 5 discos
Hanoy h = new Hanoy(5);
// Y la resolvemos (movemos de col.0 a col.2 los 5 discos
h.MoverN(0,2,5);
// Mostramos resultado, resuelto
h.Mostrar();
}
}
6 comentarios:
Amigo tienes un error en la parte del metodo de MUESTRA por el tipo de datos
import java.util.Iterator;
import java.util.Stack;
public class HanoiStack {
///// pila para las columas de la torre de hanoi
private Stack torre[];
public HanoiStack(int discos){
torre=new Stack[3];
////inicializar torres
torre[0]=new Stack();
torre[1]=new Stack();
torre[2]=new Stack();
//////colocar los disco en la primera torre de mayor a menor
for (int i=discos;i>0;i--){ torre[0].push(i);}
}
// Muestra el estado actual de las torres
public void Mostrar() {
for (int i=0;i<3;i++) {
System.out.print("Col. "+i+": ");
for (Iterator it = torre[i].iterator(); it.hasNext();) {
int n = (int) it.next();
System.out.print("["+n+"]");
}
System.out.println("");
}
}
// Mueve de la torre origen a la torre destino solo 1 disco
public void Mover(int origen, int destino) {
// Mostramos en pantalla lo que hacemos
Mostrar();
System.out.println("Movemos desde ("+origen+") hasta ("+destino+")");
System.out.println("");
// Y luego, lo hacemos
torre[destino].push(torre[origen].pop());
}
// Mueve de la torre origen a la torre destino varios discos
public void MoverN(int origen, int destino, int cuantas) {
// Si solo es uno, se mueve sin más
if (cuantas <= 1) Mover(origen,destino);
else {
// Si son varios, entonces:
// - Primero movemos N-1 a la torre ni origen ni destino
MoverN(origen,3 - (origen+destino),cuantas-1);
// - Movemos la N, es decir, la grande
Mover(origen,destino);
// - Movemos las N-1 del primer paso, a la col. destino
MoverN(3 - (origen+destino),destino,cuantas-1);
}
}
public static void main(String[] args) {
// Creamos una partida de 3 discos
HanoiStack h = new HanoiStack(3);
// Y la resolvemos (movemos de torre.0 a torre.2 los 3 discos
h.MoverN(0,2,3);
// Mostramos resultado, resuelto
h.Mostrar();
}
}
OJO: el código solo funciona para 3 discos.
gracias
y si lo quisiera hacer n x n como tendria que ser?
ayuda porfavor
Publicar un comentario