Advertisement
Dr4noel

Adancime Latime Interativa

Mar 22nd, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <iostream>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. int a[20][20];
  10. int vizitat[20];
  11. void Reset(int a[]) {
  12.     for (int i = 0;i < 20; i++) {
  13.         a[i] = 0;
  14.     }
  15. }
  16.  
  17. void Afisare() {
  18.     for (int i = 0;i < 20;i++) {
  19.         for (int j = 0;j < 20;j++) {
  20.             cout << a[i][j] << " ";
  21.         }
  22.         cout << endl;
  23.     }
  24. }
  25. void main() {
  26.     char *nume[20] = { "Arad","Bucuresti","Craiova", "Drobeta","Eforie","Fagarasi","Giurgiu","Hirsova","Iasi","Lugoj","Mehadia","Neamt","Oradea","Pitesti","Rimnicu Valcea","Sibiu","Timisoara","Urziceni","Vaslui","Zerind" };
  27.     // 0          1          2          3         4          5         6      7         8       9       10     11       12       13         14            15       16          17         18        19 
  28.     int noduri[20];
  29.     int nr_noduri = 0;
  30.     int n = 20;
  31.     int oras_Start=12, oras_Destinatie=6;
  32.     int adancime[20];               //stocheaza adancimea fiecarui nod //
  33.     int limita = 0;
  34.     int solutie[20];
  35.     int parinte[20];
  36.     int nr_solutie = 0;
  37.     int gasit = 0;
  38.     /*
  39.     cout << "Introduceti oras start: \n";
  40.     cin >> oras_Start;
  41.  
  42.     cout << "Introduceti oras destinatie: \n";
  43.     cin >> oras_Destinatie;
  44.     */
  45.     const int o_Destinatie = oras_Destinatie;
  46.  
  47.     a[0][16] = 1;
  48.     a[0][15] = 1;
  49.     a[0][19] = 1;
  50.     a[1][5] = 1;
  51.     a[1][6] = 1;
  52.     a[1][13] = 1;
  53.     a[1][17] = 1;
  54.     a[2][3] = 1;
  55.     a[2][13] = 1;
  56.     a[2][14] = 1;
  57.     a[3][10] = 1;
  58.     a[3][2] = 1;
  59.     a[4][7] = 1;
  60.     a[5][1] = 1;
  61.     a[5][15] = 1;
  62.     a[7][17] = 1;
  63.     a[8][11] = 1;
  64.     a[8][18] = 1;
  65.     a[9][10] = 1;
  66.     a[9][16] = 1;
  67.     a[12][19] = 1;
  68.     a[12][15] = 1;
  69.     a[13][14] = 1;
  70.     a[14][15] = 1;
  71.     a[17][18] = 1;
  72.     for (int i = 0;i < 20;i++) {
  73.         for (int j = 0;j < 20;j++) {
  74.             a[j][i] = a[i][j];
  75.         }
  76.     }
  77.  
  78.  
  79.     //cout << "Afisare" << endl;
  80. //  Afisare();
  81. //  int cautare;
  82. //  cout << "Introduceti indicele orasului caruia vreti sa ii aflam vecinii: "; cin >> cautare;cout << endl;
  83. //  cout << nume[cautare] << " are vecinii:" << endl;
  84. //  for (int i = 0;i < 20;i++)
  85. //      if (a[cautare][i] == 1) {
  86. //          cout << nume[i] << " ";
  87. //      }
  88.     // CAUTAREA IN ADANCIME LIMITATA ITERATIV
  89.     //x`
  90.     while (limita < n && gasit == 0) {
  91.         noduri[0] = oras_Start;
  92.         nr_noduri = 0;
  93.         Reset(vizitat);
  94.         Reset(parinte);
  95.         Reset(adancime);
  96.         nr_noduri++;
  97.         vizitat[oras_Start] = 1;
  98.         adancime[oras_Start] = 0;
  99.  
  100.         int nod;//nodul curent pe care il initializam
  101.  
  102.         while (gasit == 0 && (nr_noduri != 0)) {
  103.  
  104.             nod = noduri[0];//scoatem primul element din lista de noduri si il retinem in noduri
  105.             for (int i = 0;i < nr_noduri - 1;i++) {
  106.                 noduri[i] = noduri[i + 1];
  107.             }
  108.             nr_noduri--;
  109.             if (adancime[nod] <= limita) {
  110.                 if (nod == oras_Destinatie) {
  111.                     gasit = 1;
  112.                 }
  113.                 else {
  114.                     for (int i = 0;i < 20;i++) {
  115.                         if ((a[nod][i] == 1) && ((vizitat[i] == 0 || (vizitat[i] == 1 && adancime[i] > adancime[nod] + 1)))) {//orasele conectate de nod && nevizitate
  116.                                                                                        // adancimea veche > adancime noua
  117.                             //  orasele conectate de nod SI (fie sunt nevizitate , fie au fost vizitate) dar la o adancime mai mare decat adancimea PE care ar primi-o acum
  118.                             //
  119.  
  120.                             for (int i = nr_noduri;i > 0;) { // Adaugarea in lista de noduri la inceput a oraselor conectate de nodul Nod si nevizitate
  121.                                 noduri[i] = noduri[(i--) - 1]; // noduri[i-1] si asta in loc de a mai pune i-- la for
  122.                             }
  123.                             noduri[0] = i; // aceste 3 linii se modifica la cautarea in latime
  124.                             nr_noduri++;
  125.                             vizitat[i] = 1;
  126.                             parinte[i] = nod;
  127.                             adancime[i] = adancime[nod] + 1;
  128.                         }
  129.                     }
  130.                 }
  131.             }
  132.         }
  133.         limita++;
  134.     }
  135.  
  136.     if (gasit == 0) {
  137.         cout << "\nNu s-a gasit\n\n";
  138.     }
  139.     else {
  140.  
  141.         while (oras_Destinatie != oras_Start) {
  142.             solutie[nr_solutie++] = oras_Destinatie;
  143.             oras_Destinatie = parinte[oras_Destinatie];
  144.         }
  145.         solutie[nr_solutie] = oras_Start;
  146.  
  147.  
  148.         cout << "\nCel mai rapid drum dintre " << nume[oras_Start] << " si " << nume[o_Destinatie] << " este\n";
  149.  
  150.         for (int i = nr_solutie;i >= 0;i--) {
  151.             cout << nume[solutie[i]] << " ";
  152.         }
  153.         cout << "\nSolutia s-a gasit la limita :" << limita;
  154.     }
  155.     _getch(); //
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement