-
Notifications
You must be signed in to change notification settings - Fork 184
/
Copy patherraticants.cc
63 lines (60 loc) · 1.38 KB
/
erraticants.cc
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
// https://open.kattis.com/problems/erraticants
#include <iostream>
#include <tuple>
#include <unordered_map>
#include <vector>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<tuple<int, int>> vii;
typedef unordered_map<int, int> miii;
int main() {
int t;
cin >> t;
while (t--) {
int n;
int x = 0;
int y = 0;
int c = 0;
int p = c;
miii nodes;
vii edges;
nodes[x * 100 + y] = c++;
cin >> n;
for (int i = 0; i < n; i++) {
char d;
cin >> d;
switch (d) {
case 'S': y--; break;
case 'N': y++; break;
case 'W': x--; break;
case 'E': x++; break;
}
auto it = nodes.find(x * 100 + y);
if (it == nodes.end()) {
nodes[x * 100 + y] = c;
edges.push_back(make_tuple(p, c));
p = c++;
} else {
edges.push_back(make_tuple(p, it->second));
p = it->second;
}
}
vvi distance(c);
for (int i = 0; i < c; i++) {
distance[i] = vi(c, 100);
distance[i][i] = 0;
}
for (auto e : edges) {
int a, b;
tie(a, b) = e;
distance[a][b] = 1;
distance[b][a] = 1;
}
for (int k = 0; k < c; k++)
for (int i = 0; i < c; i++)
for (int j = 0; j < c; j++)
distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]);
cout << distance[0][p] << endl;
}
}