Advertisement
Hezov

Admitere p3

Jul 9th, 2025 (edited)
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. char** alocaMatrice(int nrLin, int nrCol)
  5. {
  6.     char **mat = new char*[nrLin];
  7.     for(int i = 0;i < nrLin;i++)
  8.         mat[i] = new char[nrCol];
  9.     return mat;
  10. }
  11. void stergeMatrice(char** mat, int nrLin)
  12. {
  13.     for(int i = 0;i < nrLin;i++)
  14.         delete[] mat[i];
  15.     delete[] mat;
  16. }
  17. // Functii care verifica daca cuvantul c poate fi plasat
  18. // in mat incepand de la pozitia (x,y) orizontal / vertical
  19. bool verifOriz(char **mat, int x, int y, char* c)
  20. {
  21.     // Daca in pozitia corespunzatoare literei din c, in matrice
  22.     // avem o alta litera si nu coincid nu putem pune cuvantul.
  23.     for(int i = 0;c[i] != 0; i++)
  24.         if(mat[x][y + i] != '-' && mat[x][y+i] != c[i]) return false;
  25.     return true;
  26. }
  27. bool verifVert(char **mat, int x, int y, char* c)
  28. {
  29.     for(int i = 0;c[i]!=0;i++)
  30.         if(mat[x + i][y] != '-' && mat[x + i][y] != c[i]) return false;
  31.     return true;
  32. }
  33. void bkt(char** cuv, int poz, int nrCuv, int nrLin, int nrCol, char **mat, char** sol)
  34. {
  35.     if(poz == nrCuv) // indexarea fiind de la 0 inseamna ca am trecut prin toate cuvintele.
  36.     {
  37.         // salvam solutia in sol
  38.         for(int i = 0;i<nrLin;i++)
  39.             for(int j = 0;j<nrCol;j++)
  40.                 sol[i][j] = mat[i][j];
  41.         return;
  42.     }
  43.     char **urm = alocaMatrice(nrLin,nrCuv); // in aceasta matrice vom efectua urmatoarea mutare.
  44.     /// Afisare stadiu curent :
  45.     /*cout << "ACUM :\n";
  46.     for(int i = 0;i<nrLin;i++,cout << '\n')
  47.         for(int j = 0;j<nrCol;j++)
  48.             cout << mat[i][j] << ' ';
  49.     cout << '\n' << '\n';*/
  50.  
  51.     for(int i = 0;i<nrLin;i++)
  52.         for(int j = 0;j<nrCol;j++)
  53.             urm[i][j] = mat[i][j];
  54.     // Incercam sa plasam cuvantul cuv[poz] pe toate pozitiile orizontale posibile
  55.     int len = strlen(cuv[poz]);
  56.     for(int i = 0;i<nrLin;i++)
  57.         for(int j = 0;j + len - 1 < nrCol;j++)
  58.             if(verifOriz(mat,i,j,cuv[poz]))
  59.             {
  60.                 // punem cuvantul in matricea urm
  61.                 for(int it = 0;it < len;it++)
  62.                     urm[i][j + it] = cuv[poz][it];
  63.                 bkt(cuv,poz+1,nrCuv,nrLin,nrCol, urm ,sol); // in urmatoarea mutare mat este urm.
  64.                 // stergem cuvantul din urm, ca sa putem face si alte mutari.
  65.                 for(int it = 0;it < len;it++)
  66.                     urm[i][j + it] = mat[i][j + it];
  67.             }
  68.     //cout << "CUV CURENT : " << cuv[poz] << '\n';
  69.     // Procedam la fel dar acum pe verticala.
  70.     for(int i = 0; i + len - 1 < nrLin;i++)
  71.         for(int j = 0;j < nrCol; j++)
  72.             if(verifVert(mat,i,j,cuv[poz]))
  73.             {
  74.                 for(int it = 0;it < len;it++)
  75.                     urm[i + it][j] = cuv[poz][it];
  76.                 bkt(cuv, poz+1 , nrCuv, nrLin, nrCol, urm , sol);
  77.                 for(int it = 0;it < len;it++)
  78.                     urm[i+it][j] = mat[i + it][j];
  79.             }
  80.     // Nu uitam sa dealocam urm ca sa nu ne luam mare memory leak!!!
  81.     stergeMatrice(urm, nrLin);
  82.  
  83. }
  84. char** solutie(char **cuv, int nrCuv, int nrLin, int nrCol)
  85. {
  86.     // In sol vom retine solutia finala si in mat vom simula mutarile
  87.     char** mat = alocaMatrice(nrLin,nrCol);
  88.     char** sol = alocaMatrice(nrLin,nrCol);
  89.     for(int i = 0;i<nrLin;i++)
  90.         for(int j = 0;j<nrCol;j++)
  91.             mat[i][j] = sol[i][j] = '-';
  92.     bkt(cuv, 0, nrCuv, nrLin, nrCol, mat, sol);
  93.    
  94.     stergeMatrice(mat,nrLin); // nu mai avem nevoie de ea deci o stergem.
  95.    
  96.     return sol;
  97. }
  98. int main()
  99. {
  100.     // Apelarea functiei pentru a rezolva exemplul.
  101.     int n = 6, m = 10;
  102.     char **cuv = alocaMatrice(n,m);
  103.     cuv[0] = "INFO";
  104.     cuv[1] = "GREU";
  105.     cuv[2] = "TEST";
  106.     cuv[3] = "REN";
  107.     cuv[4] = "JOC";
  108.     cuv[5] = "FOC";
  109.     /*for(int i = 0;i<n;i++)
  110.         cout << cuv[i] << ' ' << strlen(cuv[i]) << '\n';*/
  111.     int nrLin = 3, nrCol = 5;
  112.     char **sol = solutie(cuv, n, nrLin, nrCol);
  113.  
  114.     for(int i = 0;i<nrLin;i++, cout << '\n')
  115.         for(int j = 0;j<nrCol;j++)
  116.             cout << sol[i][j] << ' ';
  117.     return 0;
  118. }
  119.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement