Ir al contenido principal

Torres de Hanoi Recursividad - Java


















Saludos amigos por aqui les dejo un ejemplo de Recursividad Torres de Hanoi, con solucion automatica ademas con interrupcion para ver los movimientos de los discos.

descarga desde aqui hanoi2.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package applets;
/**
 *
 * @author Jeison  Nisperuza
 */
import java.awt.*;
import java.applet.*;

public class Hanoi2 extends Applet {

static final int XDOTS = 400;
static final int YDOTS = 200;
static final int NULL = -1;
static final int MAX = 20;
static final int MIN = 3;
static final int MAXCOLS = 6;
static final int MINCOLS = 3;
static final Color cfondo=new Color(228,233,243);
static final Color cbarra=Color.black;
static final Color cfin =Color.red;
static final Color ctorre=Color.blue;
boolean first=true;
int origen,destino;
int movimientos;
int h[] = new int[MAXCOLS];
int Ficha[][] = new int[MAXCOLS][MAX];
int Centorr[] = new int[MAXCOLS];
Button B[] = new Button[MAXCOLS];
TextField TFTorres, TFCols, TFMovimientos;
int numtorres=5, numcols=3;

void Parametros() {

String param;
param = getParameter("TORRES");
    if (param != null) numtorres = Integer.parseInt(param);
        param = getParameter("COLS");
            if (param != null) numcols = Integer.parseInt(param);
}

public void init() {

int i;
setBackground(cfondo);
resize(XDOTS,YDOTS);

    if (first) {
        Parametros();
        Herramientas();
        first=false;
}

for (i=0; i< MAXCOLS; i++)
    if (i< numcols) B[i].enable();
   else B[i].disable();
        for (i=0; i< numcols; i++)
            Centorr[i]=(XDOTS/(numcols+1))*(i+1);
            h[0]=numtorres;
                    for (i=1; i< numcols; i++)
                        h[i]=0;
                            for (i=0; i< numtorres; i++)
                                Ficha[0][i]=numtorres-i;
                                movimientos=0;
                                origen=destino=NULL;
}

public void Herramientas() {

setLayout(new BorderLayout());
Panel p= new Panel();
p.setBackground(cfondo);
    for (int i=0; i< MAXCOLS; i++)
        p.add(B[i]=new Button(Integer.toString(i+1)));
        p.add(new Button("Cancelar"));
        p.add(new Button("Resolver"));
        p.add(new Button("Nueva"));
        add("South",p);
        Panel g= new Panel();
        g.setBackground(cfondo);
        g.add(new Label("Columnas"));
        g.add(TFCols= new TextField(Integer.toString(numcols)));
        g.add(new Label("Torres"));
        g.add(TFTorres=new TextField(Integer.toString(numtorres)));
        g.add(new Label("Movimientos"));
        TFMovimientos=new TextField("0",8);
        TFMovimientos.disable();
        g.add(TFMovimientos);
        add("North",g);

}

public void Dibujar_Torres (Graphics g, Color coltorr) {

int x,y, Long;
int l,k;
int anchomin=(Centorr[1]-Centorr[0])/numtorres;
int altotorre=(YDOTS-85)/numtorres;
g.setColor(cbarra);
    for (k=0; k< numcols; k++)
        g.fillRect(Centorr[k]-1, 35, 2, YDOTS-75);
        g.setColor(coltorr);
            for (k=0; k< numcols; k++)
                for (l=0; l< h[k]; l++) {
                        Long=anchomin*Ficha[k][l];
                        x=(Centorr[k]-(Long/2));
                        y=YDOTS-60-l*altotorre;
                        g.fillRect(x,y,Long,altotorre-altotorre/3);
              }

}

public void paint(Graphics g) {

Dibujar_Torres(g, ctorre);
TFMovimientos.setText(Integer.toString(movimientos));
for (int i=1; i< numcols; i++)
if (h[i]==numtorres) Final();

}

public void Final() {

Dibujar_Torres(getGraphics(), cfin);

}

boolean valido(int origen, int destino) {

if (origen==NULL || destino==NULL || origen==destino) return false;
if (h[origen]==0) return false;
if (h[destino]==0) return true;
if (Ficha[destino][h[destino]-1]< Ficha[origen][h[origen]-1]) return false;
return true;

}

public void Resolver() {

Mover(numtorres,0,1,numcols-1);
}

void Desplazar(int origen, int destino) {

h[origen]--;
Ficha[destino][h[destino]]=Ficha[origen][h[origen]];
h[destino]++;
movimientos++;
}

void Mover(int Numero, int Comienzo, int Auxiliar, int Final)

{

int varaux;
for (int i=Numero; i>0; i--) {
    //----------------------------
       //esperar para que los movimientos se vean con claridad
    try {
      Thread.sleep(1000);
        } catch(InterruptedException e) {
         //g.drawString("Error en sleep", 100, 100);
  }
//--------------------------------
        Mover(i-1,Comienzo,Final,Auxiliar);
        Desplazar(Comienzo,Final);
        update(getGraphics());
        varaux=Comienzo;
        Comienzo=Auxiliar;
        Auxiliar=varaux;

    }
}

public boolean action(Event e, Object o) {

if (e.target instanceof Button) {
int i;
for (i=0 ; i< numcols; i++)
    if ((Integer.toString(i+1)).equals(e.arg)) {
        if (origen==NULL) {
            origen=i;
            B[origen].disable();
        }
    else {
        destino=i;
            for (i=0; i< numcols; i++)
                B[i].enable();
      }
    break;
   }

if( "Nueva".equals(e.arg) || "Resolver".equals(e.arg)) {

numtorres=Integer.parseInt(TFTorres.getText());
numcols =Integer.parseInt(TFCols.getText());
    if (numtorres< MIN) numtorres=MIN;
        else if (numtorres>MAX) numtorres=MAX;
            if (numcols< MINCOLS) numcols=MINCOLS;
                else if (numcols>MAXCOLS) numcols=MAXCOLS;
            TFTorres.setText(Integer.toString(numtorres));
            TFCols.setText(Integer.toString(numcols));
            TFMovimientos.setText("0");
            init();
}

  if( "Cancelar".equals(e.arg)) {
    origen=destino=NULL;
        for (i=0; i< numcols; i++)
            B[i].enable();
    }

    if( "Resolver".equals(e.arg)) Resolver();

        if (valido(origen,destino)) {
                Desplazar(origen,destino);
                origen=destino=NULL;
        }

   repaint();
   return true;
  }
return false;
}

public String getAppletInfo() {
    return "Nombre : Torres de Hanoi\r\n" +
    "Autor : Manuel Barrera \r\n" +
    "e-mail : mbarrera@inf.uach.cl.\r\n";
    }

}


Comentarios

Publicar un comentario

Entradas populares de este blog

Fireworks CS3 portable

Para que hagas los logos, botones e imagenes para tus aplicaciones facil y rapido... ¿Qué es Fireworks? Adobe Fireworks es una aplicación en forma de estudio (basada en la forma de estudio de Adobe Flash ), pero con más parecido a un taller destinado para el manejo híbrido de gráficos vectoriales con Gráficos en mapa de bits y que ofrece un ambiente eficiente tanto para la creación rápida de prototipos de sitios Web e interfaces de usuario, como para la creación y Optimización de Imágenes para web. Originalmente fue desarrollado por Macromedia , compañía que fue comprada en 2005 por Adobe Systems . Fireworks está disponible de forma individual o integrado en Adobe CS3/CS4/CS5 y por tanto ha sido diseñado para integrarse con otros productos de Adobe, como Dreamweaver y Flash . Integración con Adobe Flash La integración con Adobe Flash se ha ido reduciendo paulatinamente desde que Flash, en su versión 7, integró la herramienta PolyStar que hace un polígono...

Algoritmo para obtener el número mayor

Algoritmo para obtener el número mayor: Proceso numero_mayor                n1<-0                n2<-0                Escribir 'Ingrese el primer número'                Leer n1                Escribir 'Ingrese el segundo número'                Leer n2                Si (n1=n2) Entonces                                Escribir 'Los número...

Dada una matriz de 5 filas y 5 columnas imprimir la diagonal de la matriz.

Algoritmo para encontrar las diagonales de una matriz de un cuadrado Proceso diagonal_matrices         Dimension vect(50,50);         Escribir 'ingrese el numero filas';         Leer m;         Escribir 'ingrese el numero columnas';         Leer n;         Escribir 'Digite los valores:';         Para i<-1 Hasta m Con Paso 1 Hacer                        Escribir 'Fila ',i                        Para j<-1 Hasta n Con Paso 1 Hacer              ...