-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcleanrbt_1.cpp
104 lines (98 loc) · 3.33 KB
/
cleanrbt_1.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
#include<cstdio>
#include<utility>
#include<map>
using namespace std;
const int MAX_VALUE = 10000000;
bool isDirty(pair<int, int>& robLocation, int mask, map<pair<int, int>, int>& dirtyMap) {
printf("Roblocation: %d %d\n", robLocation.first, robLocation.second);
if(dirtyMap.find(robLocation) != dirtyMap.end()) {
int idx = dirtyMap[robLocation];
return mask & (1<<idx) == 0;
}
return false;
}
int computeMinDist(char **array, pair<int, int> robLocation, int r, int c, int mask, map<pair<int, int>, int>& dirtyMap, map<pair<pair<int, int>, int>, int>& mp) {
if(robLocation.first < 0 || robLocation.first >= r || robLocation.second < 0 || robLocation.second >= c || array[robLocation.first][robLocation.second] == 'x') {
return MAX_VALUE;
}
pair<pair<int, int>, int> coordinates;
coordinates.first = robLocation;
coordinates.second = mask;
if(mp.find(coordinates) != mp.end()) {
return mp[coordinates];
}
int dirtyCount = dirtyMap.size();
// if the current tile is dirty
// figure out the number
if(isDirty(robLocation, mask, dirtyMap)) {
mask = mask | (1 << dirtyMap[robLocation]);
}
if(mask + 1 == (1 << dirtyCount)) {
return 0;
}
mp[coordinates] = MAX_VALUE;
// check if we have already had the configuration before
pair<int, int> up;
up.first = robLocation.first - 1;
up.second = robLocation.second;
int dist = computeMinDist(array, up, r, c, mask, dirtyMap, mp);
pair<int, int> down;
down.first = robLocation.first + 1;
down.second = robLocation.second;
int val = computeMinDist(array, down, r, c, mask, dirtyMap, mp);
dist = val < dist?val:dist;
pair<int, int> left;
left.first = robLocation.first;
left.second = robLocation.second - 1;
val = computeMinDist(array, left, r, c, mask, dirtyMap, mp);
dist = val <dist?val:dist;
pair<int, int> right;
right.first = robLocation.first;
right.second = robLocation.second + 1;
val = computeMinDist(array, right, r, c, mask, dirtyMap, mp);
dist = val < dist?val:dist;
int retDist = dist + 1;
mp[coordinates] = retDist;
return retDist;
}
int main() {
while(true) {
int w,h;
pair<int, int> rob;
char c;
scanf("%d %d", &w, &h);
scanf("%c", &c);
char **array = new char*[h];
int dirtyCount = 0;
map<pair<int, int>, int> dirtyMap;
for(int i=0;i<h;++i) {
array[i] = new char[w];
for(int j=0;j<w;++j) {
scanf("%c", &array[i][j]);
if(array[i][j] == 'o') {
rob.first = i;
rob.second = j;
array[i][j] = '.';
} else if(array[i][j] == '*') {
pair<int, int> pr;
pr.first = i;
pr.second = j;
dirtyMap[pr] = dirtyCount;
dirtyCount++;
}
}
scanf("%c", &c);
}
map<pair<pair<int, int>, int>, int> mp;
int dist = computeMinDist(array, rob, h, w, 0, dirtyMap, mp);
if(dist >= MAX_VALUE) {
printf("-1\n");
} else {
printf("%d\n", dist);
}
for(int i=0;i<h;++i) {
delete [] array[i];
}
delete [] array;
}
}