Advertisement
frentzy

cautare cu cost uniform

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