frentzy

Cautare in adancime limitata iterativ

Mar 22nd, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.74 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. int distanta[20][20];
  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. void Afisare() {
  17.     for (int i = 0;i < 20;i++) {
  18.         for (int j = 0;j < 20;j++) {
  19.             cout << a[i][j] << " ";
  20.         }
  21.         cout << endl;
  22.     }
  23. }
  24. void main() {
  25.      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" }; 
  26.     int noduri[20];
  27.     int nr_noduri = 0;
  28.     int n = 20;
  29.     int oras_Start = 12, oras_Destinatie = 6;
  30.     int adancime[20];               //stocheaza adancimea fiecarui nod //
  31.     int limita = 0;
  32.     int solutie[20];
  33.     int parinte[20];
  34.     int nr_solutie = 0;
  35.     int gasit = 0;
  36.     int cost[20]; // pt fiecare nod vom stoca  distanta de la orasul de start pana la el
  37.     /*
  38.     cout << "Introduceti oras start: \n";
  39.     cin >> oras_Start;
  40.  
  41.     cout << "Introduceti oras destinatie: \n";
  42.     cin >> oras_Destinatie;
  43.     */
  44.     const int o_Destinatie = oras_Destinatie;
  45.  
  46.  
  47.     //
  48.    
  49.     distanta[0][16] = 118;
  50.     distanta[0][15] = 140;
  51.     distanta[0][19] = 75;
  52.     distanta[1][5] = 211;
  53.     distanta[1][6] = 90;
  54.     distanta[1][13] = 101;
  55.     distanta[1][17] = 85;
  56.     distanta[2][3] = 120;
  57.     distanta[2][13] = 138;
  58.     distanta[2][14] = 146;
  59.     distanta[3][10] = 75;
  60.     distanta[4][7] = 86;
  61.     distanta[5][15] = 99;
  62.     distanta[7][17] = 98;
  63.     distanta[8][11] = 87;
  64.     distanta[8][18] = 92;
  65.     distanta[9][10] = 70;
  66.     distanta[9][16] = 111;
  67.     distanta[12][19] = 71;
  68.     distanta[12][15] = 151;
  69.     distanta[13][14] = 97;
  70.     distanta[14][15] = 80;
  71.     distanta[17][18] = 142;
  72.     //###########
  73.     a[0][16] = 1;
  74.     a[0][15] = 1;
  75.     a[0][19] = 1;
  76.     a[1][5] = 1;
  77.     a[1][6] = 1;
  78.     a[1][13] = 1;
  79.     a[1][17] = 1;
  80.     a[2][3] = 1;
  81.     a[2][13] = 1;
  82.     a[2][14] = 1;
  83.     a[3][10] = 1;
  84.     a[3][2] = 1;
  85.     a[4][7] = 1;
  86.     a[5][1] = 1;
  87.     a[5][15] = 1;
  88.     a[7][17] = 1;
  89.     a[8][11] = 1;
  90.     a[8][18] = 1;
  91.     a[9][10] = 1;
  92.     a[9][16] = 1;
  93.     a[12][19] = 1;
  94.     a[12][15] = 1;
  95.     a[13][14] = 1;
  96.     a[14][15] = 1;
  97.     a[17][18] = 1;
  98.     for (int i = 0;i < 20;i++) {
  99.         for (int j = 0;j < 20;j++) {
  100.             a[j][i] = a[i][j];
  101.             distanta[j][i] = distanta[i][j];
  102.         }
  103.     }
  104.  
  105.  
  106.     //cout << "Afisare" << endl;
  107.     //  Afisare();
  108.     //  int cautare;
  109.     //  cout << "Introduceti indicele orasului caruia vreti sa ii aflam vecinii: "; cin >> cautare;cout << endl;
  110.     //  cout << nume[cautare] << " are vecinii:" << endl;
  111.     //  for (int i = 0;i < 20;i++)
  112.     //      if (a[cautare][i] == 1) {
  113.     //          cout << nume[i] << " ";
  114.     //      }
  115.     // CAUTAREA IN ADANCIME LIMITATA ITERATIV
  116.     //x`
  117.     while (limita < n && gasit == 0) {
  118.         noduri[0] = oras_Start;
  119.         nr_noduri = 0;
  120.         Reset(vizitat);
  121.         Reset(parinte);
  122.         Reset(adancime);
  123.         nr_noduri++;
  124.         vizitat[oras_Start] = 1;
  125.         adancime[oras_Start] = 0;
  126.  
  127.         int nod;//nodul curent pe care il initializam
  128.  
  129.         while (gasit == 0 && (nr_noduri != 0)) {
  130.  
  131.             nod = noduri[0];//scoatem primul element din lista de noduri si il retinem in noduri
  132.             for (int i = 0;i < nr_noduri - 1;i++) {
  133.                 noduri[i] = noduri[i + 1];
  134.             }
  135.             nr_noduri--;
  136.             if (adancime[nod] <= limita) {
  137.                 if (nod == oras_Destinatie) {
  138.                     gasit = 1;
  139.                 }
  140.                 else {
  141.                     for (int i = 0;i < 20;i++) {
  142.                         if ((a[nod][i] == 1) && ((vizitat[i] == 0 || (vizitat[i] == 1 && adancime[i] > adancime[nod] + 1)))) {//orasele conectate de nod && nevizitate
  143.                                                                                                                               // adancimea veche > adancime noua
  144.                                                                                                                               //  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
  145.                                                                                                                               //
  146.  
  147.                             for (int i = nr_noduri;i > 0;) { // Adaugarea in lista de noduri la inceput a oraselor conectate de nodul Nod si nevizitate
  148.                                 noduri[i] = noduri[(i--) - 1]; // noduri[i-1] si asta in loc de a mai pune i-- la for
  149.                             }
  150.                             noduri[0] = i; // aceste 3 linii se modifica la cautarea in latime
  151.                             nr_noduri++;
  152.                             vizitat[i] = 1;
  153.                             parinte[i] = nod;
  154.                             adancime[i] = adancime[nod] + 1;
  155.                         }
  156.                     }
  157.                 }
  158.             }
  159.         }
  160.         limita++;
  161.     }
  162.  
  163.     if (gasit == 0) {
  164.         cout << "\nNu s-a gasit\n\n";
  165.     }
  166.     else {
  167.  
  168.         while (oras_Destinatie != oras_Start) {
  169.             solutie[nr_solutie++] = oras_Destinatie;
  170.             oras_Destinatie = parinte[oras_Destinatie];
  171.         }
  172.         solutie[nr_solutie] = oras_Start;
  173.  
  174.  
  175.         cout << "\nCel mai rapid drum dintre " << nume[oras_Start] << " si " << nume[o_Destinatie] << " este\n";
  176.  
  177.         for (int i = nr_solutie; i >= 0; i--) {
  178.         if (i != 0)
  179.         cout <<"("<< nume[solutie[i]] << ") -> ";
  180.         else cout << "(" << nume[solutie[i]] << ")";
  181.         }
  182.         cout << "\nSolutia s-a gasit la limita :" << limita;
  183.     }
  184.     _getch(); //
  185. }
Add Comment
Please, Sign In to add comment