Sunteți pe pagina 1din 3

// ConsoleApplication33.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;
int main() {
char *nume[20] = { "Arad", "Bucuresti", "Craiova", "Drobeta", "Eforie",
"Fagaras", "Giurgiu", "Harsova", "Iasi", "Lugoj", "Mehadia", "Neamt", "Oradea",
"Pitesti", "Rm Valcea", "Sibiu", "Timisoara", "Urziceni", "Vaslui", "Zerind" };
// 0 1 2 3 4
5 6 7 8 9 10 11 12 13
14 15 16 17 18 19
int a[20][20], i, j, k, l, n = 20;
int oras_start = 0, oras_dest = 1, vizitat[20], noduri[20], nr_noduri = 1,
gasit = 0, nod;
int parinte[20], solutie[20], nr_solutie = 0;
int cost[20], cost_nod;
int h[20] = { 366, 0, 160, 242, 161, 176, 77, 151, 226, 244, 241, 234, 380,
10, 193, 253, 329, 80, 199, 374 }; // vector euristica

//matricea de adiacenta
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
a[i][j] = 0;

a[0][15] = 140;
a[0][16] = 118;
a[0][19] = 75;
a[1][5] = 211;
a[1][6] = 90;
a[1][13] = 101;
a[1][17] = 85;
a[2][3] = 120;
a[2][13] = 138;
a[2][14] = 145;
a[3][10] = 75;
a[4][7] = 85;
a[5][15] = 99;
a[7][17] = 98;
a[8][11] = 87;
a[8][18] = 92;
a[9][10] = 70;
a[9][16] = 111;
a[12][15] = 151;
a[12][19] = 71;
a[13][14] = 97;
a[14][15] = 80;
a[17][18] = 142;

for (i = 0; i < n; i++)


for (j = 0; j < n; j++)
if (a[i][j] != 0)
a[j][i] = a[i][j];

//Algoritm de cautare cu cost uniform


cout << "Introduceti orasul de start: ";
cin >> oras_start;
cout << "Introduceti orasul destinatie: ";
cin >> oras_dest;

//Toate orasele sunt nevizitate


for (i = 0; i < n; i++)
vizitat[i] = 0;

//Adaugam in lista noduri orasul de plecare


noduri[0] = oras_start;

//Marcam orasul de plecare ca vizitat


vizitat[oras_start] = 1;

//Initializam costul orasului de plecare cu 0;


cost[oras_start] = 0;

while ((gasit == 0) && (nr_noduri != 0)) //Cat timp solutie negasita si


noduri diferita de vida executa
{
nod = noduri[0]; //nod = scoate_din_fata(noduri) //stocam primul
element din noduri in variabila nod
for (i = 0; i < nr_noduri - 1; i++)
noduri[i] = noduri[i + 1]; //Eliminam primul element din
lista de noduri
nr_noduri--;
if (nod == oras_dest) //Daca testare_tinta[problema] se aplica
la stare(nod) atunci
gasit = 1; // Solutia este gasita //facem variabila
booleana gasit adevarata
else
{
for (i = 0; i < n; i++)
if ((a[nod][i] > 0) && ((vizitat[i] == 0) || ((vizitat[i]
== 1) && (cost[i] > cost[nod] + a[nod][i])))) //Adaugam la inceput in noduri
orasele nevizitate care sunt conectate de nod

//SAU orasele care au fost vizitate, dar costul vechi (cost[i])


este mai mare decat costul nou (cost[nod] + a[nod][i])
{
cost[i] = cost[nod] + a[nod][i]; //Stabilim costul
pentru orase gasite (suma dintre costul unui nod + distanta de la nod la ele)
k = 0; //pozitia unde vom adauga elementul i
while ((k < nr_noduri) && cost[i] > cost[noduri[k]])
k++;
for (j = nr_noduri; j > k; j--)
noduri[j] = noduri[j - 1];
noduri[k] = i;
nr_noduri++;
vizitat[i] = 1; //Orasele adaugate sunt marcate ca
vizitate
parinte[i] = nod; // Se retine pentru oricare din
orasele adaugate nodul parinte ca fiind nod
}

}
}
cost_nod = cost[oras_dest];

//construirea vectorului solutie


if (gasit == 1) // construiesc solutia doar daca am gasit-o
{
while (oras_dest != oras_start)
{
solutie[nr_solutie] = oras_dest;
oras_dest = parinte[oras_dest];
nr_solutie++;
}
solutie[nr_solutie] = oras_start;
// afisarea solutiei / drumului
for (i = nr_solutie; i >= 0; i--)
cout << nume[solutie[i]] << " ";
cout << "\nSolutia s-a gasit la un cost " << cost_nod;
}
else
cout << "Nu s-a gasit solutia ";

_getch();
}

S-ar putea să vă placă și