Vous êtes sur la page 1sur 10

Torres de Hanoi

/*
Extencion.h
*/

#include "pilas.h"

void InicioJuego (PilaDatos *,PilaDatos *, PilaDatos *);

void DibujarTorreVacia();

void Pintar(int, PilaDatos , PilaDatos, PilaDatos);

int ObtenerTop(Pila);

int torresHanoi(int ,PilaDatos *, PilaDatos *, PilaDatos *, int, int, int,int);

void RellenarTorres(int n, PilaDatos *Torre1, PilaDatos *Torre2, PilaDatos


*Torre3);

/*

*/

#ifndef _PILAS_H
#define _PILAS_H

#include <string.h>

struct _NodoPila {
int info;
struct _NodoPila *sig;
};

typedef struct _NodoPila * PilaDatos;

int PilaVacia (PilaDatos);


void CrearPila();
void Inicializacion (PilaDatos *p);
int Cima (PilaDatos);
void Desapilar (PilaDatos *); //puntero a puntero de PilaDatos
void Apilar (PilaDatos *, int);

#endif

/*
extencion.cpp
*/

#include "pilas.h"
#include <malloc.h>

/** Devuelve 0 si es falso, y diferente de 0 si es cierto **/


int PilaVacia (PilaDatos p) {
return (p==NULL);
}

/** Devuelve el top de la pila **/


//Esp.:
//R. Entrada: La Pila no puede entrar vacia
int Cima (PilaDatos p){
return (p->info);
}

/** Devuelve una nueva pila con un nuevo top **/


void Desapilar (PilaDatos *p) {
PilaDatos aux;
if (! PilaVacia(*p)) {

aux = *p;
*p = (*p)->sig;
//free(aux); <-- Fallo en free
}
}

/** Devuelve una nueva pila con un nuevo elemento **/


void Apilar (PilaDatos *p, int Elem){
PilaDatos Nodo;
Nodo=(PilaDatos)malloc(1*sizeof(PilaDatos));
Nodo->info=Elem;
Nodo->sig=*p;
*p=Nodo;
}

#include "torres.h"
#include <stdio.h>

void InicioJuego (PilaDatos *Torre1, PilaDatos *Torre2, PilaDatos *Torre3){


int final=0;
int num=0;
int mov=0;
printf("Cuantas fichas quieres?: ");
scanf("%d",&num);

RellenarTorres(num, Torre1, Torre2, Torre3);


mov=torresHanoi(num,Torre1,Torre2,Torre3,num,1,2,3,0);
printf("Numero de movimientos: %d",mov);
}

void DibujarTorreVacia(){
printf("\t-\n");
}

void RellenarTorres(int n, PilaDatos *Torre1, PilaDatos *Torre2, PilaDatos


*Torre3){
int i;
for (i=n;i>0;i--){
Apilar(Torre1,i);
}
Pintar(n,*Torre1, *Torre2, *Torre3);
printf("\n Pulsa para continuar");
getch();
system("cls");
}

void Pintar(int NumeroPiezas,PilaDatos Torre1, PilaDatos Torre2, PilaDatos


Torre3){
int i;
if (! PilaVacia(Torre1)){
printf("Torre 1\n");
printf("\n");
for (i=0;(i<NumeroPiezas && ! PilaVacia(Torre1));i++){
printf("\t%d\n",Cima(Torre1));

Desapilar(&Torre1);
}
printf("\n\t-\n");
}else{
printf("Torre 1\n");
DibujarTorreVacia();
}
if (! PilaVacia(Torre2)){
printf("Torre 2\n");
printf("\n");
for (i=0;(i<NumeroPiezas && ! PilaVacia(Torre2));i++){
printf("\t%d\n",Cima(Torre2));
Desapilar(&Torre2);
}
printf("\n\t-\n");
}else{
printf("Torre 2\n");
DibujarTorreVacia();
}
if (! PilaVacia(Torre3)){
printf("Torre 3\n");
printf("\n");
for (i=0;(i<NumeroPiezas && ! PilaVacia(Torre3));i++){
printf("\t%d\n",Cima(Torre3));
Desapilar(&Torre3);
}
printf("\n\t-\n");
}else{

printf("Torre 3\n");
DibujarTorreVacia();
}
}

int ObtenerTop(PilaDatos p){


return p->info;
}

int torresHanoi(int n,PilaDatos *ori, PilaDatos *aux, PilaDatos *des, int


piezas, int t1, int t2, int t3, int mov){
if(n==1){
printf("\n---------- Siguiente paso ----------\n");
printf("\n");
Apilar(des,ObtenerTop(*ori));
Desapilar(ori);
mov++;
switch (t1) {
case 1:
switch (t3) {
case 2:
Pintar(piezas,*ori,*des,*aux);
break;
case 3:
Pintar(piezas,*ori,*aux,*des);
break;
}
break;
case 2:

switch (t3) {
case 1:
Pintar(piezas,*des,*ori,*aux);
break;
case 3:
Pintar(piezas,*aux,*ori,*des);
break;
}
break;
case 3:
switch (t3) {
case 1:
Pintar(piezas,*des,*aux,*ori);
break;
case 2:
Pintar(piezas,*aux,*des,*ori);
break;
}
}
printf("\nPulsa cualquier tecla para ver el siguiente paso");
getch();
system("cls");
}
else{
mov=torresHanoi(n-1,ori,des,aux,piezas, t1, t3, t2,mov);
mov=torresHanoi(1, ori,aux,des,piezas, t1, t2, t3,mov);
mov=torresHanoi(n-1,aux,ori,des,piezas, t2, t1, t3,mov);
}

return mov;
}

/*
Programa principal

*/

#include "torres.h"

void main(){
PilaDatos Torre1=NULL;
PilaDatos Torre2=NULL;
PilaDatos Torre3=NULL;
InicioJuego(&Torre1,&Torre2,&Torre3);
getch();
}