Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///SOLUTIE CU BACKTRACKING.
- #include <iostream>
- using namespace std;
- int mat[4][4],v[4][4];
- /**Observatie cheie : mutarile se fac modulo 4.
- Asadar dupa ce efectuam aceiasi mutare de 4 ori
- la rand ne intoarcem in stadiul initial.
- Backtrackingul va trece prin toate cele 4^9 mutari = 2^18 = ~260k */
- /** ex : 100 va semnifica ca a fost facuta o
- 000 singura mutare pe linia 1 col 1.
- 000
- Vom folosi baza 4 si vom trece prin toate numerele de la
- 000 000 000 la 333 333 333 daca nu exista solutie.
- Altfel vom cauta cea mai scurta solutie, vom pastra matricea
- si vom afisa mutarile in ordine lexicografica.
- */
- int mutare(int linie,int coloana, int val)
- {
- for(int i = 1;i<=3;i++)
- for(int j = 1;j<=3;j++)
- if(i==linie||j==coloana)
- v[i][j] = (v[i][j] + val)%4;
- }
- bool valid()
- {
- for(int i = 1;i<=3;i++)
- for(int j = 1;j<=3;j++)
- if(v[i][j]!=0)
- return false;
- return true;
- }
- int main()
- {
- cout<<"Introdu matricea de 3x3 : \n";
- int sol = -1,solsize = -1;
- for(int i = 1;i<=3;i++)
- for(int j = 1;j<=3;j++)
- cin>>mat[i][j];
- for(int comb = 0; comb<(1<<18);comb++)
- {
- int current = comb;
- ///Matricea pe care verificam operatiile este v.
- for(int i = 1;i<=3;i++)
- for(int j = 1;j<=3;j++)
- v[i][j] = mat[i][j];
- ///Trecem prin toate cifrele din baza 4 chiar daca sunt 0.
- //(pentru claritate)
- int nr_mutari = 0;
- for(int i = 1;i <= 3;i++)
- {
- for(int j = 1;j <= 3;j++)
- {
- nr_mutari += (current%4);
- mutare(i,j,current%4);
- current/=4;
- if(valid())
- {
- if(sol==-1)
- sol = comb, solsize = nr_mutari;
- else
- if(nr_mutari<solsize) sol = comb , solsize = nr_mutari;
- }
- }
- }
- }
- if(sol==-1) cout<<"NU!";
- else
- {
- cout<<"DA\n cea mai scurta solutie contine "<<solsize<<" mutari :\n";
- for(int i = 1;i<=3;i++)
- for(int j = 1;j<=3;j++)
- {
- for(int k = 1;k<=sol%4;k++)
- cout<<i<<' '<<j<<'\n';
- sol/=4;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement