// // hanoiV.cpp // hanoiV // // Created by Francesco Donato on 09/11/12. // #include //#include #include #include using namespace std; ifstream fin; ofstream fout; const int MAX_N = 1000; int current_hanoi_conf[MAX_N +1]; int dest_hanoi_conf[MAX_N +1]; int n; void spostaDisco(int n, int from, int to, int aux); void creaTorre(int n, int to); int main(int argc, const char * argv[]) { int app; fin.open("input.txt"); assert(fin); fout.open("output.txt"); assert(fin); fin >> n; //leggo la configurazione iniziale for(int piolo=1;piolo<=3;piolo++){ fin >> app; while( app!=0 ){current_hanoi_conf[app]=piolo; fin >> app;} } //leggo la configurazione finale for(int piolo=1;piolo<=3;piolo++){ fin >> app; while( app!=0 ){dest_hanoi_conf[app]=piolo; fin >> app;} } for(int disco=n;disco>0;disco--){ if( current_hanoi_conf[disco] != dest_hanoi_conf[disco] ){ if( abs(current_hanoi_conf[disco] - dest_hanoi_conf[disco] ) == 1) spostaDisco(disco, current_hanoi_conf[disco], dest_hanoi_conf[disco], 6 - current_hanoi_conf[disco] - dest_hanoi_conf[disco]); else{ spostaDisco(disco, current_hanoi_conf[disco], 2, 4 - current_hanoi_conf[disco]); spostaDisco(disco, 2, dest_hanoi_conf[disco], 4 - dest_hanoi_conf[disco]); } } } fin.close(); fout.close(); } void creaTorre(int n, int to ){ for(int disco=n;disco>0;disco--){ if( current_hanoi_conf[disco] != to ){ if( abs(current_hanoi_conf[disco] - to ) == 1) spostaDisco(disco, current_hanoi_conf[disco], to, 6 - current_hanoi_conf[disco] - to); else{ spostaDisco(disco, current_hanoi_conf[disco], 2, 4 - current_hanoi_conf[disco]); spostaDisco(disco, 2, to, 4 - to); } } } } void spostaDisco(int n, int from, int to, int aux){ if( n>0 ){ creaTorre(n-1, aux); fout << "Sposta il disco " << n << " dal piolo " << from << " al piolo " << to << endl; current_hanoi_conf[n]=to; } }