-
Notifications
You must be signed in to change notification settings - Fork 0
/
conqueralgors.cpp
156 lines (139 loc) · 6.27 KB
/
conqueralgors.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
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// pathInfo closestFreeDijkstra(const Pos &pos) {
// priority_queue<DN, vector<DN>, greater<DN>> q;
// VVI distances(40, VI(80, 1e7));
// VVI weightedDistances(40, VI(80, 1e7));
// VVB visited(40, VB(80, false));
// q.push({0, pos, None});
// distances[pos.i][pos.j] = 0;
// weightedDistances[pos.i][pos.j] = max(houndDangerMap[pos.i][pos.j], furyanDangerMap[pos.i][pos.j]);
// while(!q.empty()) {
// Pos actPos = get<1>(q.top());
// Dir fstDir = get<2>(q.top());
// //cerr << fstDir << endl;
// q.pop();
// if(isPaintable(actPos)) return pathInfo(actPos, distances[actPos.i][actPos.j], weightedDistances[actPos.i][actPos.j], fstDir, -1);
// visited[actPos.i][actPos.j] = true;
// for(const Dir& dir : dirs) {
// Pos nwPos = actPos + dir;
// if(canPioneerPath(nwPos) and not visited[nwPos.i][nwPos.j]) {
// distances[nwPos.i][nwPos.j] = distances[actPos.i][actPos.j] + 1;
// weightedDistances[nwPos.i][nwPos.j] = distances[actPos.i][actPos.j] + max(houndDangerMap[nwPos.i][nwPos.j], furyanDangerMap[nwPos.i][nwPos.j]);
// visited[nwPos.i][nwPos.j] = true;
// //cerr << dir << endl;
// q.push({weightedDistances[nwPos.i][nwPos.j], nwPos, fstDir == None ? dir : fstDir});
// }
// }
// }
// return pathInfo();
// }
// void conquerSafe(const int id) {
// vector<vector<pair<int,Dir> > > M(40, vector<pair<int,Dir>>(80, {INF,None}));
// Pos pos = unit(id).pos;
// priority_queue<pair<int,Pos>, vector<pair<int,Pos>>, greater<pair<int,Pos>>> p_q;
// for (const Dir &dir : dirs) {
// Pos newPos = pos + dir;
// if (isOkNotRock(newPos) and not isProbFurro(newPos) and not isProbHell(newPos) and isFree(newPos) and not isOkElev(newPos)) {
// M[newPos.i][newPos.j] = {hellsDangerMap[newPos.i][newPos.j] + 1, dir};
// p_q.push({hellsDangerMap[newPos.i][newPos.j] + 1,newPos});
// }
// }
// while (not p_q.empty()) {
// int dist = p_q.top().first;
// Pos pos = p_q.top().second;
// p_q.pop();
// if (dist > M[pos.i][pos.j].first) continue;
// if (isFree(pos) and cell(pos).owner != me()) {
// PioneersConquering[id] = M[pos.i][pos.j].second;
// PioneersNoCommand.erase(id);
// updateMyMoves(id,M[pos.i][pos.j].second);
// return;
// }
// for (const Dir &dir : dirs) {
// Pos newPos = pos + dir;
// if ((not pos_ok(newPos))) continue;
// int newDist = dist + hellsDangerMap[newPos.i][newPos.j] + 1;
// if (isOkNotRock(newPos) and not isProbFurro(newPos) and not isProbHell(newPos) and newDist < M[newPos.i][newPos.j].first) {
// M[newPos.i][newPos.j] = {newDist, M[pos.i][pos.j].second};
// p_q.push({newDist,newPos});
// }
// }
// }
// }
// void conquerSafe(const int id) {
// int dist = INF;
// Pos pos = unit(id).pos;
// Dir finalDir = None;
// for (const Dir &dir : dirs) {
// Pos newPos = pos + dir;
// int d = tilesMap[newPos.i][newPos.j];
// if (isFree(newPos) and d < dist and not isProbFurro(newPos) and not isProbHell(newPos) and not isOkElev(newPos)) {
// dist = d;
// finalDir = dir;
// updateMyMoves(pos, newPos);
// }
// }
// }
// void conquerSafe(const int id) {
// vector<vector<pair<int,Dir> > > M(40, vector<pair<int,Dir>>(80, {INF,None}));
// Pos pos = unit(id).pos;
// priority_queue<pair<int,Pos>, vector<pair<int,Pos>>, greater<pair<int,Pos>>> p_q;
// for (const Dir &dir : dirs) {
// Pos newPos = pos + dir;
// if (isOkNotRock(newPos) and not isProbFurro(newPos) and not isProbHell(newPos) and isFree(newPos)) {
// M[newPos.i][newPos.j] = {hellsDangerMap[newPos.i][newPos.j] + + 1, dir};
// p_q.push({hellsDangerMap[newPos.i][newPos.j] + 1,newPos});
// }
// }
// while (not p_q.empty()) {
// int dist = p_q.top().first;
// Pos pos = p_q.top().second;
// p_q.pop();
// if (dist > M[pos.i][pos.j].first) continue;
// if (isOkNotRock(pos) and isFree(pos) and cell(pos).type != Elevator and cell(pos).owner != me()) {
// PioneersConquering[id] = M[pos.i][pos.j].second;
// PioneersNoCommand.erase(id);
// updateMyMoves(id,M[pos.i][pos.j].second);
// return;
// }
// for (const Dir &dir : dirs) {
// Pos newPos = pos + dir;
// if ((not pos_ok(newPos))) continue;
// int newDist = dist + hellsDangerMap[newPos.i][newPos.j] + 1;
// if (isOkNotRock(newPos) and not isProbFurro(newPos) and not isProbHell(newPos) and newDist < M[newPos.i][newPos.j].first) {
// M[newPos.i][newPos.j] = {newDist, M[pos.i][pos.j].second};
// p_q.push({newDist,newPos});
// }
// }
// }
// }
// void conquerSafe(const int id) {
// Pos pos = unit(id).pos;
// priority_queue<tuple<int,Pos,Dir>, vector<tuple<int,Pos,Dir>>, greater<tuple<int,Pos,Dir>>> p_q;
// M2 distances(40, V(80, INF));
// M2 wDistances(40, V(80, INF));
// M2B visited(40, VB(80, false));
// p_q.push({0,pos,None});
// distances[pos.i][pos.j] = 0;
// wDistances[pos.i][pos.j] = hellsDangerMap[pos.i][pos.j] + furroDangerMap[pos.i][pos.j][pos.k];
// while (not p_q.empty()) {
// Pos cPos = get<1>(p_q.top());
// Dir firstDir = get<2>(p_q.top());
// p_q.pop();
// if (isOkNotRock(cPos) and isFree(cPos) and cell(cPos).type != Elevator and cell(cPos).owner != me()) {
// PioneersConquering[id] = firstDir;
// PioneersNoCommand.erase(id);
// updateMyMoves(id,firstDir);
// return;
// }
// visited[cPos.i][cPos.j] = true;
// for(int t = 0; t < 8; t++) {
// Pos newPos = cPos + Dir(t);
// if(isOkNotRock(newPos) and not visited[newPos.i][newPos.j]) {
// distances[newPos.i][newPos.j] = distances[cPos.i][cPos.j] + 1;
// wDistances[newPos.i][newPos.j] = distances[cPos.i][cPos.j] + hellsDangerMap[newPos.i][newPos.j] + furroDangerMap[newPos.i][newPos.j][newPos.k];
// visited[newPos.i][newPos.j] = true;
// p_q.push({wDistances[newPos.i][newPos.j], newPos, firstDir == None ? Dir(t) : firstDir});
// }
// }
// }
// }