#include <stdio.h>
#include <stdlib.h>
typedef struct _pila{
int val;
struct _pila *next;
} _paletto;
typedef _paletto *paletto;
paletto A, B, C;
int n;
int mosse_cnt=1;
int fil=0;
int prnt=0;
FILE *output;
int pop( paletto *palo ){
if( palo == NULL ){
exit( EXIT_FAILURE );
}
paletto tmp = *palo;
int out = ( tmp )->val;
*palo = ( tmp )->next;
free( tmp );
return out;
}
void push( paletto *palo, int val ){
paletto anello = malloc( sizeof( paletto ) );
if( anello == NULL ){
exit( EXIT_FAILURE );
}
anello->next = *palo;
anello->val = val;
*palo = anello;
}
void adjust( int *a ){
int *tmp=malloc(sizeof(int)*n);
int i, j;
for( i=0; i < n && a[i]!=-1; i++ )
tmp[i]=a[i];
for( j=0; j < n-i;j++) a[j]=-1;
for(i=0; j<n;j++, i++)a[j]=tmp[i];
}
void print(){
paletto tmp = A;
int *a, *b, *c;
a = malloc( sizeof( int ) * n );
b = malloc( sizeof( int ) * n );
c = malloc( sizeof( int ) * n );
int cnt;
for(cnt=0;tmp!=NULL;cnt++){
a[cnt]=tmp->val;
tmp=tmp->next;
}
for(;cnt < n ; cnt++) a[cnt] = -1;
tmp=B;
for(cnt=0;tmp!=NULL;cnt++){
b[cnt]=tmp->val;
tmp=tmp->next;
}
for(;cnt < n ; cnt++) b[cnt] = -1;
tmp=C;
for(cnt=0;tmp!=NULL;cnt++){
c[cnt]=tmp->val;
tmp=tmp->next;
}
for(;cnt < n; cnt++) c[cnt] = -1;
adjust(a);
adjust(b);
adjust(c);
/*disegna le torri di hanoi*/
for( cnt = 0; cnt < n ; cnt++){
if( a[ cnt ] == -1 ){
int cnt1;
for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
putchar('|');
for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
}
else{
int cnt1;
for(cnt1=0;cnt1<n-a[cnt];cnt1++)putchar(' ');
for(; cnt1<n;cnt1++)putchar('°');
putchar('°');
for(cnt1=0; cnt1< a[cnt];cnt1++)putchar('°');
for(;cnt1<n;cnt1++)putchar(' ');
}
if( b[ cnt ] == -1 ){
int cnt1;
for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
putchar('|');
for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
}
else{
int cnt1;
for(cnt1=0;cnt1<n-b[cnt];cnt1++)putchar(' ');
for(; cnt1<n;cnt1++)putchar('°');
putchar('°');
for(cnt1=0; cnt1< b[cnt];cnt1++)putchar('°');
for(;cnt1<n;cnt1++)putchar(' ');
}
if( c[ cnt ] == -1 ){
int cnt1;
for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
putchar('|');
for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
}
else{
int cnt1;
for(cnt1=0;cnt1<n-c[cnt];cnt1++)putchar(' ');
for(; cnt1<n;cnt1++)putchar('°');
putchar('°');
for(cnt1=0; cnt1< c[cnt];cnt1++)putchar('°');
for(;cnt1<n;cnt1++)putchar(' ');
}
}
for(cnt=0;cnt<6*n+7;cnt++)putchar('-');
}
void sposta( char partenza, char arrivo ){
if( fil )
fprintf(output, "%d ) %c --> %c\n",mosse_cnt++, partenza, arrivo );
if( !prnt )
printf("%d ) %c --> %c\n",mosse_cnt
++, partenza
, arrivo
);
else{
print();
}
int tmp;
switch( partenza ){
case 'A':
tmp = pop( &A );
break;
case 'B':
tmp = pop( &B );
break;
case 'C':
tmp = pop( &C );
break;
}
switch( arrivo ){
case 'A':
push( &A, tmp );
break;
case 'B':
push( &B, tmp );
break;
case 'C':
push( &C, tmp );
break;
}
}
void transport( int i, char partenza, char arrivo ){
char swap;
if( partenza == 'A' ){
if( arrivo == 'B' )
swap = 'C';
else
swap = 'B';
}
if( partenza == 'B' ){
if( arrivo == 'A' )
swap = 'C';
else
swap = 'A';
}
if( partenza == 'C' ){
if( arrivo == 'B' )
swap = 'A';
else
swap = 'B';
}
if( i == 2 ){
sposta( partenza, swap );
sposta( partenza, arrivo );
sposta( swap, arrivo );
}
else if( i == 1 ) sposta( partenza, arrivo );
else if( i == 0 );
else{
transport( i-1, partenza, swap );
sposta( partenza, arrivo );
transport( i-1, swap, arrivo );
}
}
int main( int argc, char **argv ){
"\t 888' `888' `\"'\n"
"\t 888 888 .oooo. ooo. .oo. .ooooo. oooo \n"
"\t 888ooooo888 `P )88b `888P\"Y88b d88' `88b `888 \n"
"\t 888 888 .oP\"888 888 888 888 888 888 \n"
"\t 888 888 d8( 888 888 888 888 888 888 \n"
"\to888o o888o `Y888""8o o888o o888o `Y8bod8P' o888o \n\n\n\n"
"ooooooooooooo \n"
"8' 888 `8 \n"
" 888 .ooooo. oooo oooo ooo .ooooo. oooo d8b .oooo.o \n"
" 888 d88' `88b `88. `88. .8' d88' `88b `888\"\"8P d88( \"8 \n"
" 888 888 888 `88..]88..8' 888ooo888 888 `\"Y88b. \n"
" 888 888 888 `888'`888' 888 .o 888 o. )88b \n"
" o888o `Y8bod8P' `8' `8' `Y8bod8P' d888b 8\"\"888P' \n\n\n\n\n");
"\t\t °°° | |\n"
"\t\t °°°°° | |\n"
"\t\t °°°°°°° | |\n"
"\t\t----------------------------------\n\n\n");
int i;
char sel[2];
int anim;
if( argc == 2 )
n = atoi( argv[ 1 ] );
else{
printf("Quanti anelli vuoi usare? ");
scanf("%d", &n );
}
selezione:
printf("Vuoi salvare l'output anche su file? ");
scanf("%s", sel);
switch( sel[0] ){
case 'y':
fil = 1;
char name[50];
etichetta:
printf("Inserisci il nome del file : ");
scanf( "%s", name );
if( ( output = fopen( name, "w" ) ) == NULL ){
printf("Nome file non valido\n");
goto etichetta;
}
break;
case 'n':
break;
default:
printf("Scelta non valida\n");
goto selezione;
}
selezione1:
printf("Vuoi disegnare i passaggi per risolvere le torri di Hanoi? ");
scanf("%s", sel);
switch(sel[0]){
case 'y':
anim=1;
break;
case 'n':
anim=0;
break;
default:
printf("Scelta non valida\n");
goto selezione1;
}
for( i=n;i>=1;i--)
push( &A, i );
transport( n-1, 'A', 'B');
sposta( 'A', 'C');
transport(n-1, 'B', 'C');
if(anim){
for( i=0; i<n;i++)pop(&C);
for( i=n;i>=1;i--)
push( &A, i );
prnt=1;
transport( n-1, 'A', 'B');
sposta( 'A', 'C');
transport(n-1, 'B', 'C');
print();
}
getch();
}