-
Notifications
You must be signed in to change notification settings - Fork 0
/
GraphSearch.cpp
72 lines (51 loc) · 2.2 KB
/
GraphSearch.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<list>
#include<vector>
#include<iostream>
#include"GraphSearch.h"
#include"Utils.h"
//===================== Busca em Profundidade ====================//
std::vector<int> get_neighbors(int node, std::vector<std::vector<int>> G) { // definindo uma função q retorna os vizinhos
return G[node];
}
bool is_goal(int node) { // definindo uma função q diz q o nó 9 é o objetivo
return (node == 9);
}
std::list<int> dfs(int s, std::vector<std::vector<int>> G) { //assinatura do método definida em .h
std::list<int> start({s}); // implementar o caminho da fronteira, lista com nó inicial s
std::list<std::list<int>> frontier({start}); // implementar a fronteira
while (!frontier.empty()) { // enquanto a fronteira não estiver vazio
printSequenceSequence(frontier); // Utils.h
std::list<int> path(frontier.back()); // faz uma cópia do ultimo caminho da fronteira
frontier.pop_back(); // agr retira o ultimo caminho sem retornar o elemento (pop_back)
if (is_goal(path.back())) { // verificar se ele é o objetivo. is_goal = função que recebe o último nó do caminho (criamos)
return path;
}
else {
for (auto e: get_neighbors(path.back(), G)) { // descobrir os vizinhos, criar método q retorna uma lista com os vizinhos do ultimo nó (criamos)
std::list<int> new_path(path); // novo caminho que é cópia do caminho que tiramos da fronteira
new_path.push_back(e); // novo caminho
frontier.push_back(new_path); // add no final da fronteira
}
}
}
}
//===================== Busca em Largura ====================//
std::list<int> bfs(int s, std::vector<std::vector<int>> G) {
std::list<int> start({ s });
std::list<std::list<int>> frontier({ start });
while (!frontier.empty()) {
printSequenceSequence(frontier);
std::list<int> path(frontier.front()); //tira do inicio
frontier.pop_front();
if (is_goal(path.back())) {
return path;
}
else {
for (auto e : get_neighbors(path.back(), G)) { // verifica se tem vizinhos
std::list<int> new_path(path); // cria noto caminho para cada vizinho
new_path.push_back(e);
frontier.push_back(new_path); // insere no final
}
}
}
}