Advertisement
frentzy

cautarea in adancime limitata

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