Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Hanoi  - hanoi.c

hanoi.c

Caricato da:
Scarica il programma completo

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct _pila{
  5.     int val;
  6.     struct _pila *next;
  7. } _paletto;
  8.  
  9. typedef _paletto *paletto;
  10.  
  11. paletto A, B, C;
  12. int n;
  13. int mosse_cnt=1;
  14. int fil=0;
  15. int prnt=0;
  16. FILE *output;
  17.  
  18. int pop( paletto *palo ){
  19.     if( palo == NULL ){
  20.         printf("Pila vuota");
  21.         exit( EXIT_FAILURE );
  22.     }
  23.     paletto tmp = *palo;
  24.     int out = ( tmp )->val;
  25.     *palo = ( tmp )->next;
  26.     free( tmp );
  27.     return out;
  28. }
  29.  
  30. void push( paletto *palo, int val ){
  31.     paletto anello = malloc( sizeof( paletto ) );
  32.     if( anello == NULL ){
  33.         printf("No Memory");
  34.         exit( EXIT_FAILURE );
  35.     }
  36.     anello->next = *palo;
  37.     anello->val = val;
  38.     *palo = anello;
  39. }
  40.  
  41. void adjust( int *a ){
  42.     int *tmp=malloc(sizeof(int)*n);
  43.     int i, j;
  44.     for( i=0; i < n  && a[i]!=-1; i++ )
  45.         tmp[i]=a[i];
  46.     for( j=0; j < n-i;j++) a[j]=-1;
  47.     for(i=0; j<n;j++, i++)a[j]=tmp[i];
  48. }    
  49. void print(){
  50.     paletto tmp = A;
  51.     int *a, *b, *c;
  52.     a = malloc( sizeof( int ) * n  );
  53.     b = malloc( sizeof( int ) * n  );
  54.     c = malloc( sizeof( int ) * n  );
  55.     int cnt;
  56.     for(cnt=0;tmp!=NULL;cnt++){
  57.         a[cnt]=tmp->val;
  58.         tmp=tmp->next;
  59.     }
  60.     for(;cnt < n ; cnt++) a[cnt] = -1;
  61.     tmp=B;
  62.     for(cnt=0;tmp!=NULL;cnt++){
  63.         b[cnt]=tmp->val;
  64.         tmp=tmp->next;
  65.     }
  66.     for(;cnt < n ; cnt++) b[cnt] = -1;
  67.     tmp=C;
  68.     for(cnt=0;tmp!=NULL;cnt++){
  69.         c[cnt]=tmp->val;
  70.         tmp=tmp->next;
  71.     }
  72.     for(;cnt < n; cnt++) c[cnt] = -1;
  73.     adjust(a);
  74.     adjust(b);
  75.     adjust(c);
  76.      /*disegna le torri di hanoi*/
  77.    
  78.     for( cnt = 0; cnt < n ; cnt++){
  79.         if( a[ cnt ] == -1 ){
  80.             int cnt1;
  81.             for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
  82.             putchar('|');
  83.             for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
  84.         }
  85.         else{
  86.             int cnt1;
  87.             for(cnt1=0;cnt1<n-a[cnt];cnt1++)putchar(' ');
  88.             for(; cnt1<n;cnt1++)putchar('°');
  89.             putchar('°');
  90.             for(cnt1=0; cnt1< a[cnt];cnt1++)putchar('°');
  91.             for(;cnt1<n;cnt1++)putchar(' ');
  92.         }      
  93.         printf("  ");
  94.         if( b[ cnt ] == -1 ){
  95.             int cnt1;
  96.             for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
  97.             putchar('|');
  98.             for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
  99.         }
  100.         else{
  101.             int cnt1;
  102.             for(cnt1=0;cnt1<n-b[cnt];cnt1++)putchar(' ');
  103.             for(; cnt1<n;cnt1++)putchar('°');
  104.             putchar('°');
  105.             for(cnt1=0; cnt1< b[cnt];cnt1++)putchar('°');
  106.             for(;cnt1<n;cnt1++)putchar(' ');
  107.         }      
  108.         printf("  ");
  109.         if( c[ cnt ] == -1 ){
  110.             int cnt1;
  111.             for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
  112.             putchar('|');
  113.             for(cnt1=0; cnt1<n;cnt1++) putchar(' ');
  114.         }
  115.         else{
  116.             int cnt1;
  117.             for(cnt1=0;cnt1<n-c[cnt];cnt1++)putchar(' ');
  118.             for(; cnt1<n;cnt1++)putchar('°');
  119.             putchar('°');
  120.             for(cnt1=0; cnt1< c[cnt];cnt1++)putchar('°');
  121.             for(;cnt1<n;cnt1++)putchar(' ');
  122.         }      
  123.         printf("\n");
  124.     }
  125.     for(cnt=0;cnt<6*n+7;cnt++)putchar('-');    
  126. }
  127.        
  128. void sposta( char partenza, char arrivo ){
  129.     if( fil )
  130.         fprintf(output, "%d ) %c --> %c\n",mosse_cnt++, partenza, arrivo );
  131.     if( !prnt )
  132.         printf("%d ) %c --> %c\n",mosse_cnt++, partenza, arrivo );
  133.     else{
  134.         print();
  135.         printf("\n\n\n");
  136.     }    
  137.     int tmp;
  138.     switch( partenza ){
  139.         case 'A':
  140.             tmp = pop( &A );
  141.             break;
  142.         case 'B':
  143.             tmp = pop( &B );
  144.             break;
  145.         case 'C':
  146.             tmp = pop( &C );
  147.             break;
  148.     }    
  149.    
  150.     switch( arrivo ){
  151.         case 'A':
  152.             push( &A, tmp );
  153.             break;
  154.         case 'B':
  155.             push( &B, tmp );
  156.             break;
  157.         case 'C':
  158.             push( &C, tmp );
  159.             break;
  160.     }
  161. }
  162.  
  163. void transport( int i, char partenza, char arrivo ){
  164.     char swap;
  165.         if( partenza == 'A' ){
  166.             if( arrivo == 'B' )
  167.                 swap = 'C';
  168.             else
  169.                 swap = 'B';
  170.         }
  171.         if( partenza == 'B' ){
  172.             if( arrivo == 'A' )
  173.                 swap = 'C';
  174.             else
  175.                 swap = 'A';
  176.         }
  177.         if( partenza == 'C' ){
  178.             if( arrivo == 'B' )
  179.                 swap = 'A';
  180.             else
  181.                 swap = 'B';
  182.         }
  183.     if( i == 2 ){  
  184.         sposta( partenza, swap );
  185.         sposta( partenza, arrivo );
  186.         sposta( swap, arrivo );
  187.     }
  188.     else if( i == 1 ) sposta( partenza, arrivo );
  189.     else if( i == 0 );
  190.     else{
  191.         transport( i-1, partenza, swap );
  192.         sposta( partenza, arrivo );
  193.         transport( i-1, swap, arrivo );
  194.     }    
  195. }        
  196.  
  197. int main( int argc, char **argv ){
  198.     printf("\tooooo   ooooo                                  o8o\n"
  199.               "\t 888'   `888'                                  `\"'\n"  
  200.               "\t 888     888   .oooo.   ooo. .oo.    .ooooo.  oooo  \n"
  201.                "\t 888ooooo888  `P  )88b  `888P\"Y88b  d88' `88b `888  \n"
  202.                "\t 888     888   .oP\"888   888   888  888   888  888  \n"
  203.                "\t 888     888  d8(  888   888   888  888   888  888  \n"
  204.               "\to888o   o888o `Y888""8o   o888o o888o `Y8bod8P' o888o \n\n\n\n"                    
  205.     "ooooooooooooo                            \n"                            
  206.      "8'   888   `8                              \n"                          
  207.       "     888       .ooooo.  oooo oooo    ooo  .ooooo.  oooo d8b  .oooo.o \n"
  208.        "     888      d88' `88b  `88. `88.  .8'  d88' `88b `888\"\"8P d88(  \"8 \n"
  209.        "     888      888   888   `88..]88..8'   888ooo888  888     `\"Y88b.  \n"
  210.         "     888      888   888    `888'`888'    888    .o  888     o.  )88b \n"
  211.          "    o888o     `Y8bod8P'     `8'  `8'     `Y8bod8P' d888b    8\"\"888P' \n\n\n\n\n");
  212.          
  213.          printf("\t\t    |             |              |\n"
  214.                 "\t\t   °°°            |              |\n"
  215.                 "\t\t  °°°°°           |              |\n"
  216.                 "\t\t °°°°°°°          |              |\n"
  217.                 "\t\t----------------------------------\n\n\n");
  218.  
  219.         int i;
  220.         char sel[2];
  221.         int anim;
  222.        
  223.     if( argc == 2 )
  224.         n = atoi( argv[ 1 ] );
  225.         else{
  226.         printf("Quanti anelli vuoi usare? ");
  227.         scanf("%d", &n );
  228.     }
  229.     selezione:
  230.     printf("Vuoi salvare l'output anche su file? ");
  231.     scanf("%s", sel);
  232.     switch( sel[0] ){
  233.             case 'y':
  234.                 fil = 1;
  235.                 char name[50];
  236.                 etichetta:
  237.                 printf("Inserisci il nome del file : ");
  238.                 scanf( "%s", name );
  239.                 if( ( output = fopen( name, "w" ) ) == NULL ){
  240.                     printf("Nome file non valido\n");
  241.                     goto etichetta;
  242.                 }      
  243.                 break;
  244.             case 'n':
  245.                 break;
  246.             default:
  247.                 printf("Scelta non valida\n");
  248.                 goto selezione;
  249.     }
  250.     selezione1:    
  251.     printf("Vuoi disegnare i passaggi per risolvere le torri di Hanoi? ");
  252.     scanf("%s", sel);
  253.     switch(sel[0]){
  254.         case 'y':
  255.             anim=1;
  256.             break;
  257.         case 'n':
  258.             anim=0;
  259.             break;
  260.         default:
  261.             printf("Scelta non valida\n");
  262.             goto selezione1;
  263.    }    
  264.                        
  265.                  
  266.     for( i=n;i>=1;i--)
  267.         push( &A, i );
  268.         transport( n-1, 'A', 'B');
  269.         sposta( 'A', 'C');
  270.         transport(n-1, 'B', 'C');
  271.         printf("\n\n\n");
  272.         if(anim){
  273.             for( i=0; i<n;i++)pop(&C);
  274.         for( i=n;i>=1;i--)
  275.                 push( &A, i );
  276.             prnt=1;
  277.         transport( n-1, 'A', 'B');
  278.         sposta( 'A', 'C');
  279.         transport(n-1, 'B', 'C');
  280.             print();
  281.         }    
  282.         getch();
  283. }