Advertisement
frentzy

Cautare A*

Apr 26th, 2018
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.59 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 = 1;
  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.     int h[20] = { 366,0,160,242,161,176,77,151,226,244,241,234,380,101,193,253,329,80,199,374 };
  34.     //euristica ,vector ce reprezinta distantele in linie dreapta pan ala bucuresti
  35.     /*
  36.     cout << "Introduceti oras start: \n";
  37.     cin >> oras_Start;
  38.  
  39.     cout << "Introduceti oras destinatie: \n";
  40.     cin >> oras_Destinatie;
  41.     */
  42.     const int o_Destinatie = oras_Destinatie;
  43.     a[0][16] = 118;
  44.     a[0][15] = 140;
  45.     a[0][19] = 75;
  46.     a[1][5] = 211;
  47.     a[1][6] = 90;
  48.     a[1][13] = 101;
  49.     a[1][17] = 85;
  50.     a[2][3] = 120;
  51.     a[2][13] = 138;
  52.     a[2][14] = 146;
  53.     a[3][10] = 75;
  54.     a[4][7] = 86;
  55.     a[5][15] = 99;
  56.     a[7][17] = 98;
  57.     a[8][11] = 87;
  58.     a[8][18] = 92;
  59.     a[9][10] = 70;
  60.     a[9][16] = 111;
  61.     a[12][19] = 71;
  62.     a[12][15] = 151;
  63.     a[13][14] = 97;
  64.     a[14][15] = 80;
  65.     a[17][18] = 142;
  66.  
  67.     /*a[0][16] = 1;
  68.     a[0][15] = 1;
  69.     a[0][19] = 1;
  70.     a[1][5] = 1;
  71.     a[1][6] = 1;
  72.     a[1][13] = 1;
  73.     a[1][17] = 1;
  74.     a[2][3] = 1;
  75.     a[2][13] = 1;
  76.     a[2][14] = 1;
  77.     a[3][10] = 1;
  78.     a[3][2] = 1;
  79.     a[4][7] = 1;
  80.     a[5][1] = 1;
  81.     a[5][15] = 1;
  82.     a[7][17] = 1;
  83.     a[8][11] = 1;
  84.     a[8][18] = 1;
  85.     a[9][10] = 1;
  86.     a[9][16] = 1;
  87.     a[12][19] = 1;
  88.     a[12][15] = 1;
  89.     a[13][14] = 1;
  90.     a[14][15] = 1;
  91.     a[17][18] = 1;*/
  92.     for (int i = 0; i < 20; i++) {
  93.         for (int j = 0; j < 20; j++) {
  94.             a[j][i] = a[i][j];
  95.  
  96.         }
  97.     }
  98.  
  99.  
  100.     //cout << "Afisare" << endl;
  101.     //  Afisare();
  102.     //  int cautare;
  103.     //  cout << "Introduceti indicele orasului caruia vreti sa ii aflam vecinii: "; cin >> cautare;cout << endl;
  104.     //  cout << nume[cautare] << " are vecinii:" << endl;
  105.     //  for (int i = 0;i < 20;i++)
  106.     //      if (a[cautare][i] == 1) {
  107.     //          cout << nume[i] << " ";
  108.     //      }
  109.     // CAUTAREA CU COST UNIFORM
  110.  
  111.     noduri[0] = oras_Start;
  112.     nr_noduri++;
  113.     vizitat[oras_Start] = 1;
  114.     cost[oras_Start] = 0;
  115.     int gasit = 0;
  116.     int nod;//nodul curent pe care il initializam
  117.     while (gasit == 0 && (nr_noduri != 0)) {
  118.  
  119.         nod = noduri[0];//scoatem primul element din lista de noduri si il retinem in noduri
  120.         for (int i = 0; i < nr_noduri - 1; i++) {
  121.             noduri[i] = noduri[i + 1];
  122.         }
  123.         nr_noduri--;
  124.  
  125.         if (nod == oras_Destinatie) {
  126.             gasit = 1;
  127.         }
  128.         else {
  129.             for (int i = 0; i < 20; i++) {
  130.                 if ((a[nod][i] != 0) && ((vizitat[i] == 0) || ((vizitat[i] == 1) && (cost[i] >  cost[nod] + a[nod][i])))) {//orasele conectate de nod && nevizitate
  131.                                                                                                                            // costul vechi e mai mare decat noul cost                                                                  
  132.                                                                                                                            //  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
  133.                                                                                                                            //
  134.                     cost[i] = cost[nod] + a[nod][i];
  135.                     int j = 0;
  136.                     while ((j < nr_noduri) && (cost[i]+h[i] >cost[noduri[j]]+ h[noduri[j]])) {
  137.                         j++;// j va fi pozitia PE care inserez in lista de noduri
  138.                     }
  139.                     for (int k = nr_noduri; k > j; k--) { // Adaug acel i astfel incat lista sa fie ordonata crescator dupa cost
  140.                         noduri[k] = noduri[k - 1]; // noduri[i-1] si asta in loc de a mai pune i-- la for
  141.                     }
  142.                     noduri[j] = i; // aceste 3 linii se modifica la cautarea in latime
  143.                     nr_noduri++;
  144.                     vizitat[i] = 1;
  145.                     parinte[i] = nod;
  146.                     adancime[i] = adancime[nod] + 1;
  147.                 }
  148.             }
  149.         }
  150.     }
  151.  
  152.     int c = cost[oras_Destinatie];
  153.     if (gasit == 0) {
  154.         cout << "\nNu s-a gasit\n\n";
  155.     }
  156.     else {
  157.  
  158.         while (oras_Destinatie != oras_Start) {
  159.             solutie[nr_solutie++] = oras_Destinatie;
  160.             oras_Destinatie = parinte[oras_Destinatie];
  161.         }
  162.         solutie[nr_solutie] = oras_Start;
  163.  
  164.  
  165.         cout << "\nDrumul  dintre " << nume[oras_Start] << " si " << nume[o_Destinatie] << " este\n";
  166.  
  167.         for (int i = nr_solutie; i >= 0; i--) {
  168.             cout << nume[solutie[i]] << " ";
  169.         }
  170.         cout << endl << "Lungimea drumului este: " << c;
  171.     }
  172.     _getch();
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement