Advertisement
Tucancitto

Lab3 - Pb3

Apr 9th, 2021 (edited)
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. struct MATRICE
  9. {
  10.     int valoare = 0, ordin = 0;
  11. };
  12.  
  13. struct GRAF
  14. {
  15.     vector<vector<int>> ListaAdiac;
  16.  
  17.     void citire(string fisier, int& ordStart, int& ordDest)
  18.     {
  19.         ifstream fin(fisier);
  20.         if (fin.peek() == EOF) {
  21.             cout << "Fisierul este vid. \n";
  22.         }
  23.  
  24.         int dim;
  25.         fin >> dim;
  26.  
  27.         vector<vector<MATRICE>> mat;
  28.         mat.resize(dim);
  29.  
  30.         int ordin = 0;
  31.         for (int index = 0; index < dim; ++index)
  32.         {
  33.             mat[index].resize(dim);
  34.             for (int index2 = 0; index2 < dim; ++index2)
  35.             {
  36.                 int val;
  37.                 fin >> val;
  38.                 mat[index][index2].valoare = val;
  39.                 mat[index][index2].ordin = ordin++;
  40.             }
  41.         }
  42.  
  43.         formareListe(mat);
  44.  
  45.         int startLinie, startColoana, destLinie, destColoana;
  46.         fin >> startLinie >> startColoana;
  47.         fin >> destLinie >> destColoana;
  48.  
  49.         ordStart = mat[startLinie][startColoana].ordin;
  50.         ordDest = mat[destLinie][destColoana].ordin;
  51.  
  52.         clear(mat);
  53.     }
  54.  
  55.     bool inMatrice(int x, int y, int dim)
  56.     {
  57.         return (x >= 0 && x < dim&& y >= 0 && y < dim);
  58.     }
  59.  
  60.     const int dx[4] = { -1, 0, 1, 0 };
  61.     const int dy[4] = { 0, 1, 0, -1 };
  62.  
  63.     void formareListe(vector<vector<MATRICE>> mat)
  64.     {
  65.         ListaAdiac.resize(mat.size() * mat.size());
  66.  
  67.         for (int index = 0; index < mat.size(); ++index)
  68.             for (int index2 = 0; index2 < mat.size(); ++index2)
  69.             {
  70.                 for (int i = 0; i < 4; ++i)
  71.                 {
  72.                     int x = index + dx[i] * mat[index][index2].valoare;
  73.                     int y = index2 + dy[i] * mat[index][index2].valoare;
  74.  
  75.                     if (inMatrice(x, y, mat.size()))
  76.                         ListaAdiac[mat[index][index2].ordin].push_back(mat[x][y].ordin);
  77.                 }
  78.             }
  79.  
  80.         for (int index = 0; index < ListaAdiac.size(); ++index)
  81.             sort(ListaAdiac[index].begin(), ListaAdiac[index].end());
  82.     }
  83.  
  84.     void afisareListe()
  85.     {
  86.  
  87.         for (int index = 0; index < ListaAdiac.size(); ++index)
  88.         {
  89.             cout << "L[" << index << "]: ";
  90.             for (int index2 = 0; index2 < ListaAdiac[index].size(); ++index2)
  91.                 cout << ListaAdiac[index][index2] << ' ';
  92.             cout << endl;
  93.         }
  94.         cout << endl;
  95.     }
  96.  
  97.     int BFS(int start, int dest)
  98.     {
  99.         queue<int> coada;
  100.         vector<bool> viz;
  101.         vector<int> dist;
  102.  
  103.         viz.resize(ListaAdiac.size());
  104.         dist.resize(ListaAdiac.size());
  105.  
  106.         for (int index = 0; index < ListaAdiac.size(); ++index)
  107.             viz[index] = 0, dist[index] = INT_MAX;
  108.  
  109.         dist[start] = 0;
  110.  
  111.         viz[start] = 1;
  112.         coada.push(start);
  113.  
  114.         while (!coada.empty())
  115.         {
  116.             int cap = coada.front();
  117.             coada.pop();
  118.             for (int index = 0; index < ListaAdiac[cap].size(); index++)
  119.             {
  120.                 int succ = ListaAdiac[cap][index];
  121.                 if (viz[succ] == 0)
  122.                 {
  123.                     viz[succ] = 1;
  124.                     coada.push(succ);
  125.  
  126.                     dist[succ] = dist[cap] + 1;
  127.                     if (succ == dest)
  128.                         return dist[dest];
  129.                 }
  130.             }
  131.         }
  132.         return -1;
  133.     }
  134.  
  135.     template<typename T>
  136.     void clear(vector<T>& mat)
  137.     {
  138.         for (int index = 0; index < mat.size(); ++index)
  139.         {
  140.             mat[index].clear();
  141.             mat[index].shrink_to_fit();
  142.         }
  143.         mat.clear();
  144.         mat.shrink_to_fit();
  145.     }
  146. };
  147.  
  148. int main()
  149. {
  150.     GRAF graf;
  151.     int start, dest;
  152.     graf.citire("matrice.in", start, dest);
  153.     graf.afisareListe();
  154.  
  155.     int dist = graf.BFS(start, dest);
  156.     if (dist != -1)
  157.         cout << "Numarul minim de mutari necesare pentru a ajunge la destinatie: " << dist << endl;
  158.     else
  159.         cout << "Nu s-a putut ajunge la destinatie. \n";
  160.  
  161.     graf.clear(graf.ListaAdiac);
  162.  
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement