Skip to content

Commit 5742947

Browse files
authored
Update cat-and-mouse.cpp
1 parent a966fa6 commit 5742947

File tree

1 file changed

+29
-57
lines changed

1 file changed

+29
-57
lines changed

C++/cat-and-mouse.cpp

Lines changed: 29 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,65 +3,51 @@
33

44
class Solution {
55
private:
6-
template <typename A, typename B, typename C>
7-
struct TupleHash {
8-
size_t operator()(const tuple<A, B, C>& p) const {
9-
size_t seed = 0;
10-
A a; B b; C c;
11-
tie(a, b, c) = p;
12-
seed ^= std::hash<A>{}(a) + 0x9e3779b9 + (seed<<6) + (seed>>2);
13-
seed ^= std::hash<B>{}(b) + 0x9e3779b9 + (seed<<6) + (seed>>2);
14-
seed ^= std::hash<C>{}(c) + 0x9e3779b9 + (seed<<6) + (seed>>2);
15-
return seed;
16-
}
17-
};
18-
using Lookup = unordered_map<tuple<int, int, int>, int, TupleHash<int, int, int>>;
19-
206
enum Location {HOLE, MOUSE_START, CAT_START};
217
enum Result {DRAW, MOUSE, CAT};
228

239
public:
2410
int catMouseGame(vector<vector<int>>& graph) {
25-
Lookup degree;
11+
vector<vector<vector<int>>> degree(size(graph), vector<vector<int>>(size(graph), vector<int>(2)));
2612
unordered_set<int> ignore(cbegin(graph[HOLE]), cend(graph[HOLE]));
2713
for (int m = 0; m < size(graph); ++m) {
2814
for (int c = 0; c < size(graph); ++c) {
29-
degree[make_tuple(m, c, MOUSE)] = size(graph[m]);
30-
degree[make_tuple(m, c, CAT)] = size(graph[c]) - ignore.count(c);
15+
degree[m][c][MOUSE - 1] = size(graph[m]);
16+
degree[m][c][CAT - 1] = size(graph[c]) - ignore.count(c);
3117
}
3218
}
33-
Lookup color;
19+
vector<vector<vector<int>>> color(size(graph), vector<vector<int>>(size(graph), vector<int>(2)));
3420
queue<tuple<int, int, int, int>> q;
3521
for (int i = 0; i < size(graph); ++i) {
3622
if (i == HOLE) {
3723
continue;
3824
}
39-
color[make_tuple(HOLE, i, CAT)] = MOUSE;
25+
color[HOLE][i][CAT - 1] = MOUSE;
4026
q.emplace(HOLE, i, CAT, MOUSE);
4127
for (const auto& t : {MOUSE, CAT}) {
42-
color[make_tuple(i, i, t)] = CAT;
28+
color[i][i][t - 1] = CAT;
4329
q.emplace(i, i, t, CAT);
4430
}
4531
}
4632
while (!empty(q)) {
4733
const auto [i, j, t, c] = q.front(); q.pop();
4834
for (const auto& [ni, nj, nt] : parents(graph, i, j, t)) {
49-
if (color[make_tuple(ni, nj, nt)] != DRAW) {
35+
if (color[ni][nj][nt - 1] != DRAW) {
5036
continue;
5137
}
5238
if (nt == c) {
53-
color[make_tuple(ni, nj, nt)] = c;
39+
color[ni][nj][nt - 1] = c;
5440
q.emplace(ni, nj, nt, c);
5541
continue;
5642
}
57-
--degree[make_tuple(ni, nj, nt)];
58-
if (!degree[make_tuple(ni, nj, nt)]) {
59-
color[make_tuple(ni, nj, nt)] = c;
43+
--degree[ni][nj][nt - 1];
44+
if (!degree[ni][nj][nt - 1]) {
45+
color[ni][nj][nt - 1]= c;
6046
q.emplace(ni, nj, nt, c);
6147
}
6248
}
6349
}
64-
return color[make_tuple(MOUSE_START, CAT_START, MOUSE)];
50+
return color[MOUSE_START][CAT_START][MOUSE - 1];
6551
}
6652

6753
private:
@@ -87,84 +73,70 @@ class Solution {
8773
// Space: O(n^2)
8874
class Solution2 {
8975
private:
90-
template <typename A, typename B, typename C>
91-
struct TupleHash {
92-
size_t operator()(const tuple<A, B, C>& p) const {
93-
size_t seed = 0;
94-
A a; B b; C c;
95-
tie(a, b, c) = p;
96-
seed ^= std::hash<A>{}(a) + 0x9e3779b9 + (seed<<6) + (seed>>2);
97-
seed ^= std::hash<B>{}(b) + 0x9e3779b9 + (seed<<6) + (seed>>2);
98-
seed ^= std::hash<C>{}(c) + 0x9e3779b9 + (seed<<6) + (seed>>2);
99-
return seed;
100-
}
101-
};
102-
using Lookup = unordered_map<tuple<int, int, int>, int, TupleHash<int, int, int>>;
103-
10476
enum Location {HOLE, MOUSE_START, CAT_START};
10577
enum Result {DRAW, MOUSE, CAT};
10678

10779
public:
10880
int catMouseGame(vector<vector<int>>& graph) {
109-
Lookup degree;
81+
vector<vector<vector<int>>> degree(size(graph), vector<vector<int>>(size(graph), vector<int>(2)));
11082
unordered_set<int> ignore(cbegin(graph[HOLE]), cend(graph[HOLE]));
11183
for (int m = 0; m < size(graph); ++m) {
11284
for (int c = 0; c < size(graph); ++c) {
113-
degree[make_tuple(m, c, MOUSE)] = size(graph[m]);
114-
degree[make_tuple(m, c, CAT)] = size(graph[c]) - ignore.count(c);
85+
degree[m][c][MOUSE - 1] = size(graph[m]);
86+
degree[m][c][CAT - 1] = size(graph[c]) - ignore.count(c);
11587
}
11688
}
117-
Lookup color;
89+
vector<vector<vector<int>>> color(size(graph), vector<vector<int>>(size(graph), vector<int>(2)));
11890
queue<tuple<int, int, int>> q1;
11991
queue<tuple<int, int, int>> q2;
12092
for(int i = 0; i < size(graph); ++i) {
12193
if (i == HOLE) {
12294
continue;
12395
}
124-
color[make_tuple(HOLE, i, CAT)] = MOUSE;
96+
color[HOLE][i][CAT - 1] = MOUSE;
12597
q1.emplace(HOLE, i, CAT);
12698
for (const auto& t : {MOUSE, CAT}) {
127-
color[make_tuple(i, i, t)] = CAT;
99+
color[i][i][t - 1] = CAT;
128100
q2.emplace(i, i, t);
129101
}
130102
}
131103
while (!empty(q1)) {
132104
const auto [i, j, t] = q1.front(); q1.pop();
133105
for (const auto& [ni, nj, nt] : parents(graph, i, j, t)) {
134-
if (color[make_tuple(ni, nj, nt)] != DRAW) {
106+
if (color[ni][nj][nt - 1] != DRAW) {
135107
continue;
136108
}
137109
if (t == CAT) {
138-
color[make_tuple(ni, nj, nt)] = MOUSE;
110+
color[ni][nj][nt - 1] = MOUSE;
139111
q1.emplace(ni, nj, nt);
140112
continue;
141113
}
142-
--degree[make_tuple(ni, nj, nt)];
143-
if (!degree[make_tuple(ni, nj, nt)]) {
144-
color[make_tuple(ni, nj, nt)] = MOUSE;
114+
--degree[ni][nj][nt - 1];
115+
if (!degree[ni][nj][nt - 1]) {
116+
color[ni][nj][nt - 1] = MOUSE;
145117
q1.emplace(ni, nj, nt);
146118
}
147119
}
148120
}
149121
while (!empty(q2)) {
150122
const auto [i, j, t] = q2.front(); q2.pop();
151123
for (const auto& [ni, nj, nt] : parents(graph, i, j, t)) {
152-
if (color[make_tuple(ni, nj, nt)] != DRAW) {
124+
if (color[ni][nj][nt - 1] != DRAW) {
153125
continue;
154126
}
155127
if (t == MOUSE) {
156-
color[make_tuple(ni, nj, nt)] = CAT;
128+
color[ni][nj][nt - 1] = CAT;
157129
q2.emplace(ni, nj, nt);
158130
continue;
159131
}
160-
--degree[make_tuple(ni, nj, nt)];
161-
if (!degree[make_tuple(ni, nj, nt)]) {
162-
color[make_tuple(ni, nj, nt)] = CAT;
132+
--degree[ni][nj][nt - 1];
133+
if (!degree[ni][nj][nt - 1]) {
134+
color[ni][nj][nt - 1] = CAT;
163135
q2.emplace(ni, nj, nt);
164136
}
165137
}
166138
}
167-
return color[make_tuple(MOUSE_START, CAT_START, MOUSE)];
139+
return color[MOUSE_START][CAT_START][MOUSE - 1];
168140
}
169141

170142
private:

0 commit comments

Comments
 (0)