#include #define MAX_M 1024 // massimo numero di mosse che potrebbero capitarmi using namespace std; int Mosse[MAX_M]; // vettore contenente la sequenza di mosse che sto provando int risolvi(int A, int B, int C, int n) // procedura che risolvere il problema con (A,B,C) { // e restituisce il numero di mosse con cui vincere, -1 altrimenti int temp; if (A==1 && B==1 && C==1) return n; // se e' cosi', ho trovato una soluzione if ( !(A>=B && B>=C && C>0) ) return -1; // se e' cosi', ho fatto una mossa non valida if ( (A%3)*(B%3)*(C%3)==0 ) return -1; // ottimizzazione: per una proprieta' matem. questi casi non vanno // se no, tento la mossa 1 Mosse[n] = 1; // memorizzo che l'n-esima mossa e' 1 if (A%2==0) { temp=risolvi(A/2,B,C,n+1); // risolvo la situazione che ottengo dopo la mossa } else { temp=risolvi(A+3,B-3,C,n+1); } if (temp >= 0) return temp; // se e' cosi', ho trovato una soluzione // se non ho ancora trovato niente, tento la mossa 2 Mosse[n] = 2; // memorizzo che l'n-esima mossa e' 2 if (B%2==0) { temp=risolvi(A,B/2,C,n+1); // risolvo la situazione che ottengo dopo la mossa } else { temp=risolvi(A,B+3,C-3,n+1); } if (temp >= 0) return temp; // se e' cosi', ho trovato una soluzione // se non ho ancora trovato niente, tento la mossa 3 Mosse[n] = 3; // memorizzo che l'n-esima mossa e' 3 if (C%2==0) { temp=risolvi(A,B,C/2,n+1); // risolvo la situazione che ottengo dopo la mossa } if (temp >= 0) return temp; // se e' cosi', ho trovato una soluzione return -1; // se non ho trovato niente finora, e' perche' // non c'e' verso } int main() { int A, B, C, sol; cin >> A >> B >> C; // leggo l'input int nmosse = risolvi(A,B,C,0); // gli faccio risolvere la situazione richiesta cout << nmosse << endl; // stampo il numero di mosse for (int i=0; i