-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmap.h
114 lines (78 loc) · 2.71 KB
/
map.h
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#pragma once
#include <istream>
#include <algorithm>
#include "adjlistnondirgraph.h"
#include "queue.h"
#include "vector2.h"
// --- "using" types
using CharMap = DynArray<DynArray<char>>;
using Road = std::pair<Vector2, Vector2>;
using Roads = DynArray<Road>;
using PosDir = std::pair<Vector2, Vector2>;
class Map
{
private:
// --- Classes
struct Vertex
{
char name;
Vector2 pos;
Vertex()
{
}
Vertex(Vector2 l_pos)
: name('\0')
, pos(l_pos)
{
}
Vertex(char l_name, Vector2 l_pos)
: name(l_name)
, pos(l_pos)
{
}
};
// --- Member variables
AdjListNonDirGraph m_graph;
CharMap m_char_map;
DynArray<Vertex> m_nodes;
char m_road_char = '\0';
char m_correct_road = '\0';
char m_endp_char = '\0';
char m_mark_char = '!';
// --- Helper methods
auto findNode(const Vector2 &l_pos) const;
auto findNode(char l_char) const;
auto findNodeOrThrow(char l_char) const;
bool isOutOfBounds(const CharMap &l_char_map, const Vector2 &l_node) const;
bool isNode(const Vector2 &l_node) const;
bool isEndpointChar(char l_ch) const;
bool loadCharMap(std::istream &stream);
void loadEndpoints(const CharMap &l_char_map);
void labelCharMap();
DynArray<Vector2> initDirections();
void initBFSQueue(const DynArray<Vector2> &l_directions,
const CharMap &l_char_map,
Queue<PosDir> &l_bfs_queue);
void handleBFSQueue(Queue<PosDir> &l_bfs_queue, CharMap &l_char_map,
Roads &l_roads, const DynArray<Vector2> &l_directions);
void moveRunner(Vector2 &l_runner, const PosDir &l_pos_dir, Queue<PosDir> &l_bfs_queue,
CharMap &l_char_map, Roads &l_roads, const DynArray<Vector2> &l_directions);
void checkAdjacentRoad(DynArray<Vector2> &l_road_dirs, const PosDir &l_pos_dir,
const DynArray<Vector2> &l_directions,
const CharMap &l_char_map, Vector2 &l_runner);
Roads loadRoads(const CharMap &l_char_map);
auto insertNode(const Vector2 &l_node);
void loadGraph(Roads &l_roads);
void markCorrectRoad(int l_start, int l_finish, int l_x_y, bool l_is_x,
CharMap &l_char_map) const;
public:
// --- C/D-tors
Map() = default;
Map(Map &&l_map) = default;
// --- Member functions
const CharMap &getCharMap() const;
CharMap getCharMapWithPath(char l_vert1, char l_vert2) const;
void setCharMapEncoding(char l_road_char, char l_correct_char,
char l_endp_char);
bool load(std::istream &stream);
};