Advertisement
marius7122

Untitled

Jan 8th, 2022
1,029
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct Stare
  8. {
  9.     int dim;
  10.     vector<vector<int>> mat;
  11.     Stare(int n)
  12.     {
  13.         mat.resize(n, vector<int>(n));
  14.         dim = n;
  15.     }
  16. };
  17.  
  18. bool esteRezolvabila(Stare &s)
  19. {
  20.     vector<int> v;
  21.     for(int i = 0; i < s.dim; i++)
  22.         for(int j = 0; j < s.dim; j++)
  23.             v.push_back(s.mat[i][j]);
  24.    
  25.     int nrInversiuni = 0;
  26.     for(int i = 0; i < v.size(); i++)
  27.     {
  28.         if(v[i] == 0)
  29.             continue;
  30.         for(int j = i + 1; j < v.size(); j++)
  31.             if(v[j] < v[i] && v[j] != 0)
  32.                 nrInversiuni++;
  33.     }
  34.  
  35.     // Caz1: matrice de dimensiune impara => nr inversiuni par
  36.     if(s.dim % 2 == 1)
  37.     {
  38.         return nrInversiuni % 2 == 0;
  39.     }
  40.    
  41.     int linieSpatiu;
  42.     bool gasit = false;
  43.     int linieSpatiuDeJos = 1;
  44.     for(int i = s.dim - 1; i >= 0 && !gasit; i--)
  45.     {
  46.         for(int j = 0; j < s.dim && !gasit; j++)
  47.             if(s.mat[i][j] == 0)
  48.             {
  49.                 linieSpatiu = i + 1;
  50.                 gasit = true;
  51.             }
  52.        
  53.         if(!gasit)
  54.             linieSpatiuDeJos++;
  55.     }
  56.  
  57.     // Caz2: matrice de dimensiune para si spatiul se afla pe o linie para inumarand de jos in sus (ex: penultima) =>
  58.     //          nr de inversiuni trebuie sa fie impar
  59.     if(linieSpatiuDeJos % 2 == 0)
  60.         return nrInversiuni % 2 == 1;
  61.  
  62.     // Caz3: matrice de dimensiune para si spatiul se afla pe o linie impara inumarand de jos in sus (ex: ultima, antepenultima) =>
  63.     //          nr de inversiuni trebuie sa fie par
  64.     return nrInversiuni % 2 == 0;
  65.  
  66. }
  67.  
  68. vector<Stare> genereazaStari(Stare &parinte)
  69. {
  70.     int iSpatiu = 0;
  71.     int jSpatiu = 0;
  72.     bool gasit = 0;
  73.     for(int i = 0; i < parinte.dim && !gasit; i++)
  74.         for(int j = 0; j < parinte.dim && !gasit; j++)
  75.             if(parinte.mat[i][j] == 0)
  76.             {
  77.                 iSpatiu = i;
  78.                 jSpatiu = j;
  79.                 gasit = true;
  80.             }
  81.  
  82.     vector<Stare> copii;
  83.     // jos
  84.     int iSpatiuNou = iSpatiu + 1;
  85.     int jSpatiuNou = jSpatiu;
  86.     if(iSpatiuNou < parinte.dim)
  87.     {
  88.         Stare jos(parinte.dim);
  89.         jos.mat = parinte.mat;
  90.         swap(jos.mat[iSpatiu][jSpatiu], jos.mat[iSpatiuNou][jSpatiuNou]);
  91.         copii.push_back(jos);
  92.     }
  93.  
  94.     // sus
  95.     iSpatiuNou = iSpatiu - 1;
  96.     jSpatiuNou = jSpatiu;
  97.     if(iSpatiuNou >= 0)
  98.     {
  99.         Stare sus(parinte.dim);
  100.         sus.mat = parinte.mat;
  101.         swap(sus.mat[iSpatiu][jSpatiu], sus.mat[iSpatiuNou][jSpatiuNou]);
  102.         copii.push_back(sus);
  103.     }
  104.  
  105.     // stanga
  106.     iSpatiuNou = iSpatiu;
  107.     jSpatiuNou = jSpatiu - 1;
  108.     if(jSpatiuNou >= 0)
  109.     {
  110.         Stare stanga(parinte.dim);
  111.         stanga.mat = parinte.mat;
  112.         swap(stanga.mat[iSpatiu][jSpatiu], stanga.mat[iSpatiuNou][jSpatiuNou]);
  113.         copii.push_back(stanga);
  114.     }
  115.  
  116.     // dreapta
  117.     iSpatiuNou = iSpatiu;
  118.     jSpatiuNou = jSpatiu + 1;
  119.     if(jSpatiuNou < parinte.dim)
  120.     {
  121.         Stare dreapta(parinte.dim);
  122.         dreapta.mat = parinte.mat;
  123.         swap(dreapta.mat[iSpatiu][jSpatiu], dreapta.mat[iSpatiuNou][jSpatiuNou]);
  124.         copii.push_back(dreapta);
  125.     }
  126.  
  127.     return copii;
  128. }
  129.  
  130. Stare citesteStare(const char numeFisier[])
  131. {
  132.     ifstream fin(numeFisier);
  133.  
  134.     int n;
  135.     fin >> n;
  136.     Stare s(n);
  137.  
  138.     for(int i = 0; i < n; i++)
  139.         for(int j = 0; j < n; j++)
  140.             fin >> s.mat[i][j];
  141.  
  142.     fin.close();
  143.     return s;
  144. }
  145.  
  146. void afisazaStare(const char numeFisier[], Stare &s)
  147. {
  148.     ofstream fout(numeFisier);
  149.  
  150.     for(int i = 0; i < s.dim; i++)
  151.     {
  152.         for(int j = 0; j < s.dim; j++)
  153.             fout << s.mat[i][j] << ' ';
  154.         fout << '\n';
  155.     }
  156.  
  157.     fout.close();
  158. }
  159.  
  160. bool existaDuplicat(vector<Stare> &stari)
  161. {
  162.     for(int i = 0; i < stari.size(); i++)
  163.         for(int j = i + 1; j < stari.size(); j++)
  164.         {    
  165.             if(stari[i].mat == stari[j].mat)
  166.                 return true;
  167.         }
  168.     return false;
  169. }
  170.  
  171. void afisazaStarePeEcran(Stare &s)
  172. {
  173.     for(int i = 0; i < s.dim; i++)
  174.     {
  175.         for(int j = 0; j < s.dim; j++)
  176.             cout << s.mat[i][j] << ' ';
  177.         cout << '\n';
  178.     }
  179.     cout << '\n';
  180. }
  181.  
  182. int main()
  183. {
  184.     // verificare citire si afisare
  185.     Stare stareInititiala = citesteStare("date.in");
  186.     afisazaStare("date.out", stareInititiala);
  187.  
  188.     cout << "Starea initiala: " << '\n';
  189.     afisazaStarePeEcran(stareInititiala);
  190.  
  191.     // verificare existaDuplicat
  192.     Stare s1(2);
  193.     s1.mat = {
  194.         {1, 2},
  195.         {3, 0}
  196.     };
  197.     Stare s2(2);
  198.     s2.mat = {
  199.         {1, 3},
  200.         {2, 0}
  201.     };
  202.     Stare s3(2);
  203.     s3.mat = {
  204.         {1, 2},
  205.         {3, 0}
  206.     };
  207.  
  208.     vector<Stare> stari = {s1, s2, s3};
  209.     cout << "Exista duplicat: " << existaDuplicat(stari) << '\n';
  210.  
  211.     // verificare esteRezolvabil
  212.     cout << "Starea initiala este rezovabila: " << esteRezolvabila(stareInititiala) << '\n';
  213.  
  214.     // verificare genereazaStari
  215.     vector<Stare> copii = genereazaStari(stareInititiala);
  216.     cout << "Stari generate de la starea initiala: \n";
  217.     for(int i = 0; i < copii.size(); i++)
  218.         afisazaStarePeEcran(copii[i]);
  219.    
  220.     return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement