Advertisement
Hezov

Solutie cu backtracking

Jul 18th, 2024
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. ///SOLUTIE CU BACKTRACKING.
  2. #include <iostream>
  3. using namespace std;
  4. int mat[4][4],v[4][4];
  5. /**Observatie cheie : mutarile se fac modulo 4.
  6. Asadar dupa ce efectuam aceiasi mutare de 4 ori
  7. la rand ne intoarcem in stadiul initial.
  8. Backtrackingul va trece prin toate cele 4^9 mutari = 2^18 = ~260k */
  9.  
  10. /** ex : 100  va semnifica ca a fost facuta o
  11.          000  singura mutare pe linia 1 col 1.
  12.          000
  13.     Vom folosi baza 4 si vom trece prin toate numerele de la
  14.     000 000 000  la 333 333 333 daca nu exista solutie.
  15.     Altfel vom cauta cea mai scurta solutie, vom pastra  matricea
  16.     si vom afisa mutarile in ordine lexicografica.
  17. */
  18. int mutare(int linie,int coloana, int val)
  19. {
  20.   for(int i = 1;i<=3;i++)
  21.     for(int j = 1;j<=3;j++)
  22.         if(i==linie||j==coloana)
  23.             v[i][j] = (v[i][j] + val)%4;
  24. }
  25. bool valid()
  26. {
  27.     for(int i = 1;i<=3;i++)
  28.         for(int j = 1;j<=3;j++)
  29.             if(v[i][j]!=0)
  30.                 return false;
  31.     return true;
  32. }
  33. int main()
  34. {
  35.     cout<<"Introdu matricea de 3x3 : \n";
  36.     int sol = -1,solsize = -1;
  37.     for(int i = 1;i<=3;i++)
  38.         for(int j = 1;j<=3;j++)
  39.             cin>>mat[i][j];
  40.     for(int comb = 0; comb<(1<<18);comb++)
  41.     {
  42.         int current = comb;
  43.         ///Matricea pe care verificam operatiile este v.
  44.         for(int i = 1;i<=3;i++)
  45.             for(int j = 1;j<=3;j++)
  46.                 v[i][j] = mat[i][j];
  47.         ///Trecem prin toate cifrele din baza 4 chiar daca sunt 0.
  48.         //(pentru claritate)
  49.         int nr_mutari = 0;
  50.         for(int i = 1;i <= 3;i++)
  51.         {
  52.             for(int j = 1;j <= 3;j++)
  53.             {
  54.                 nr_mutari += (current%4);
  55.                 mutare(i,j,current%4);
  56.                 current/=4;
  57.                 if(valid())
  58.                 {
  59.                     if(sol==-1)
  60.                         sol = comb, solsize = nr_mutari;
  61.                     else
  62.                         if(nr_mutari<solsize) sol = comb , solsize = nr_mutari;
  63.                 }
  64.             }
  65.         }
  66.     }
  67.     if(sol==-1) cout<<"NU!";
  68.     else
  69.     {
  70.         cout<<"DA\n cea mai scurta solutie contine "<<solsize<<" mutari :\n";
  71.         for(int i = 1;i<=3;i++)
  72.             for(int j = 1;j<=3;j++)
  73.             {
  74.                 for(int k = 1;k<=sol%4;k++)
  75.                     cout<<i<<' '<<j<<'\n';
  76.                 sol/=4;
  77.             }
  78.  
  79.     }
  80.     return 0;
  81. }
  82.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement