struct HANOI{
int tope;
int disco[10];
};
//-----------------------------------------------------------------------------
// INICIALIZAR PILA
//-----------------------------------------------------------------------------
void inicializar(struct HANOI *pila)
{
int i;
pila->tope = 0;
for (i=0 ; i<11 ; i++)
pila->disco[i]=0;
}
//-----------------------------------------------------------------------------
// EMPEZAR
//-----------------------------------------------------------------------------
void empezar(int n, struct HANOI *pila)
{
int y;
int i;
y=n;
for(i=0 ; i<n ; i++ )
{
pila->disco[pila->tope] = y; pila->tope++;y--;
}
}
//-----------------------------------------------------------------------------
void imprimir(int n,struct HANOI *pila1 , struct HANOI *pila2, struct HANOI *pila3)
{
clrscr();
int y=17;
int cont1=0;
int cont2=0;
int cont3=0;
char a=219;
int x1=5;
int x2=30;
int x3=55;
int i;
int k;
int m;
int r;
for (i=0; i<n ; i++)
{
gotoxy(x1,y);
for(k=0 ; k < pila1->disco[cont1] ; k++)
}
cont1++;
x1++;
gotoxy(x2,y);
for(m=0 ; m < pila2->disco[cont2] ; m++)
{
}
cont2++;
x2++;
gotoxy(x3,y);
for(r=0 ; r < pila3->disco[cont3] ; r++)
{
}
cont3++;
x3++;
y--;
gotoxy(x1,(y-2));
}
}
//-----------------------------------------------------------------------------
// HANOI
//-----------------------------------------------------------------------------
void funcion_hanoi(int n, struct HANOI *pila1 , struct HANOI *pila2 , struct HANOI *pila3)
{
int vacio,mayor,menor;
int cuenta_mov=0;
if (n % 2 == 0 )
{
char x='1';
do
{
switch(x)
{
case '1':
pila2->disco[pila2->tope]=pila1->disco[(pila1->tope)-1];
pila1->disco[(pila1->tope)-1]=0;
pila2->tope=(pila2->tope)+1;
pila1->tope=(pila1->tope)-1;
x='2';
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
break;
case '2':
pila3->disco[pila3->tope]=pila2->disco[(pila2->tope)-1];
pila2->disco[(pila2->tope)-1]=0;
pila3->tope=(pila3->tope)+1;
pila2->tope=(pila2->tope)-1;
x='3';
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
if ( pila3->tope == n )
{
gotoxy
(37,20);printf("Listo!"); gotoxy
(33,21);printf("MOVIMIENTOS: %d", cuenta_mov
); }
break;
case '3':
pila1->disco[pila1->tope]=pila3->disco[(pila3->tope)-1];
pila3->disco[(pila3->tope)-1]=0;
pila1->tope=(pila1->tope)+1;
pila3->tope=(pila3->tope)-1;
x='1';
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
break;
};
char aux=x;
switch(aux)
{
case '1':
if((pila2->disco[(pila2->tope)-1] < pila3->disco[(pila3->tope)-1]) || pila3->tope == 0)
{
pila3->disco[pila3->tope]=pila2->disco[(pila2->tope)-1];
pila2->disco[(pila2->tope)-1]=0;
pila3->tope=(pila3->tope)+1;
pila2->tope=(pila2->tope)-1;
}
else
{
pila2->disco[pila2->tope]=pila3->disco[(pila3->tope)-1];
pila3->disco[(pila3->tope)-1]=0;
pila3->tope=(pila3->tope)-1;
pila2->tope=(pila2->tope)+1;
}
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
break;
case '2':
if((pila1->disco[(pila1->tope)-1] < pila3->disco[(pila3->tope)-1]) || pila3->tope == 0)
{
pila3->disco[pila3->tope]=pila1->disco[(pila1->tope)-1];
pila1->disco[(pila1->tope)-1]=0;
pila3->tope=(pila3->tope)+1;
pila1->tope=(pila1->tope)-1;
}
else
{
pila1->disco[pila1->tope]=pila3->disco[(pila3->tope)-1];
pila3->disco[(pila3->tope)-1]=0;
pila1->tope=(pila1->tope)+1;
pila3->tope=(pila3->tope)-1;
}
cuenta_mov++;
imprimir(n,pila1,pila2,pila3);
break;
case '3':
if(((pila1->disco[(pila1->tope)-1] < pila2->disco[(pila2->tope)-1]) && pila1->tope!=0) || pila2->tope == 0)
{
pila2->disco[pila2->tope]=pila1->disco[(pila1->tope)-1];
pila1->disco[(pila1->tope)-1]=0;
pila2->tope=(pila2->tope)+1;
pila1->tope=(pila1->tope)-1;
}
else
{
pila1->disco[pila1->tope]=pila2->disco[(pila2->tope)-1];
pila2->disco[(pila2->tope)-1]=0;
pila1->tope=(pila1->tope)+1;
pila2->tope=(pila2->tope)-1;
}
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
break;
};
}while(pila3->tope != n );
}
else
{
char x='1';
while(pila3->tope != n )
{
switch(x)
{
case '1':
pila3->disco[pila3->tope]=pila1->disco[(pila1->tope)-1];
pila1->disco[(pila1->tope)-1]=0;
pila3->tope=(pila3->tope)+1;
pila1->tope=(pila1->tope)-1;
x='3';
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
if ( pila3->tope == n )
{
gotoxy
(37,20);printf("Listo!"); gotoxy
(33,21);printf("MOVIMIENTOS: %d", cuenta_mov
); }
break;
case '2':
pila1->disco[pila1->tope]=pila2->disco[(pila2->tope)-1];
pila2->disco[(pila2->tope)-1]=0;
pila1->tope=(pila1->tope)+1;
pila2->tope=(pila2->tope)-1;
x='1';
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
break;
case '3':
pila2->disco[pila2->tope]=pila3->disco[(pila3->tope)-1];
pila3->disco[(pila3->tope)-1]=0;
pila2->tope=(pila2->tope)+1;
pila3->tope=(pila3->tope)-1;
x='2';
imprimir(n,pila1,pila2,pila3);
cuenta_mov++;
break;
};
char aux=x;
switch(aux)
{
case '1':
if((pila2->disco[(pila2->tope)-1] < pila3->disco[(pila3->tope)-1]) || pila3->tope == 0)
{
pila3->disco[pila3->tope]=pila2->disco[(pila2->tope)-1];
pila2->disco[(pila2->tope)-1]=0;
pila3->tope=(pila3->tope)+1;
pila2->tope=(pila2->tope)-1;
}
else
{
pila2->disco[pila2->tope]=pila3->disco[(pila3->tope)-1];
pila3->disco[(pila3->tope)-1]=0;
pila3->tope=(pila3->tope)-1;
pila2->tope=(pila2->tope)+1;
}
cuenta_mov++;
imprimir(n,pila1,pila2,pila3);
break;
case '2':
if((pila1->disco[(pila1->tope)-1] < pila3->disco[(pila3->tope)-1]) || pila3->tope == 0)
{
pila3->disco[pila3->tope]=pila1->disco[(pila1->tope)-1];
pila1->disco[(pila1->tope)-1]=0;
pila3->tope=(pila3->tope)+1;
pila1->tope=(pila1->tope)-1;
}
else
{
pila1->disco[pila1->tope]=pila3->disco[(pila3->tope)-1];
pila3->disco[(pila3->tope)-1]=0;
pila1->tope=(pila1->tope)+1;
pila3->tope=(pila3->tope)-1;
}
cuenta_mov++;
imprimir(n,pila1,pila2,pila3);
break;
case '3':
if(((pila1->disco[(pila1->tope)-1] < pila2->disco[(pila2->tope)-1]) && pila1->tope!=0) || pila2->tope == 0)
{
pila2->disco[pila2->tope]=pila1->disco[(pila1->tope)-1];
pila1->disco[(pila1->tope)-1]=0;
pila2->tope=(pila2->tope)+1;
pila1->tope=(pila1->tope)-1;
}
else
{
pila1->disco[pila1->tope]=pila2->disco[(pila2->tope)-1];
pila2->disco[(pila2->tope)-1]=0;
pila1->tope=(pila1->tope)+1;
pila2->tope=(pila2->tope)-1;
}
cuenta_mov++;
imprimir(n,pila1,pila2,pila3);
break;
};
}
}
}