#include #include int iniziale[1000]; int finale[1000]; int n; FILE *F; int istower(int disco, int piolo){ //printf("verifica\n"); while(disco>0){ if(iniziale[disco]!=piolo) return 0; disco--; } return 1; } void spostadisco(int disco, int da, int a){ assert(disco>0); assert(istower(disco-1,6-da-a)==1); fprintf(F, "Sposta il disco %d dal piolo %d al piolo %d\n", disco,da,a); iniziale[disco]=a; } void spostatorre(int disco, int da, int a, int supporto){ assert(disco>=0); if(disco==0) return; assert(istower(disco,iniziale[disco])==1); //printf("chiamo spostatorreT con %d %d %d %d\n", disco-1,da,supporto,a); spostatorre(disco-1,da,supporto,a); //printf("chiamo spostadiscoT con %d %d %d\n", disco,da,a); /*if (abs(da-a)==1)*/ spostadisco(disco,da,a); //printf("chiamo spostatorreT con %d %d %d %d\n", disco-1,supporto,a,da); spostatorre(disco-1,supporto,a,da); } void creatorre(int disco, int piolo){ assert(disco>=0); if(disco==0) return; if(iniziale[disco]==piolo) { //printf("chiamo creatorreCC con %d e %d\n", disco-1,piolo); creatorre(disco-1,piolo); } else{ int supporto=6-iniziale[disco]-piolo; //printf("chiamo creatorreC con %d e %d\n", disco-1,supporto); creatorre(disco-1, supporto); //printf("chiamo spostadiscoC con %d %d %d\n", disco,iniziale[disco],piolo); /*if (abs(iniziale[disco]-piolo)==1)*/ spostadisco(disco,iniziale[disco],piolo); //else printf("boh\n"); //printf("chiamo spostatorreC con %d %d %d %d\n", disco-1,supporto,piolo,6-supporto-piolo); spostatorre(disco-1,supporto,piolo,6-supporto-piolo); } } void passo_hanoi(){ int max, conf_a,conf_b; max=n; while((max>0)&&(iniziale[max]==finale[max])) max--; //se il piolo รจ a posto cambio disco if (max==0) return; //tutti i dischi sono a posto int supporto=6-iniziale[max]-finale[max]; //printf("chiamo creatorreP con %d %d\n", max-1,supporto); creatorre(max-1,supporto); //printf("chiamo spostadiscoP con %d %d %d\n", max,iniziale[max],finale[max]); /*if (abs(iniziale[max]-finale[max])==1)*/ spostadisco(max,iniziale[max],finale[max]); //else printf("boh\n"); //printf("max vale %d\n", max); //printf("chiamo passo_hanoiP\n"); passo_hanoi(); } void main(){ int disco; //leggo il file F=fopen("input.txt","r"); fscanf(F,"%d", &n); //numero dischi assert (n<=1000); //leggo la configurazione iniziale int piolo; for(piolo=1; piolo<=3; piolo++) { fscanf(F,"%d", &disco); while(disco!=0) { iniziale[disco]=piolo; fscanf(F,"%d", &disco); } } //printf("\n"); //leggo la configurazione finale for(piolo=1; piolo<=3; piolo++) { fscanf(F,"%d", &disco); while(disco!=0) { finale[disco]=piolo; fscanf(F,"%d", &disco); } } //printf("\n"); //chiudo il file fclose(F); //creo il file di output F=fopen("output.txt","w"); //printf("chiamo passo_hanoi\n"); passo_hanoi(); //esegue un passo di hanoi fclose(F); }