3
3
4
4
class Solution {
5
5
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
-
20
6
enum Location {HOLE, MOUSE_START, CAT_START};
21
7
enum Result {DRAW, MOUSE, CAT};
22
8
23
9
public:
24
10
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 ))) ;
26
12
unordered_set<int > ignore (cbegin (graph[HOLE]), cend (graph[HOLE]));
27
13
for (int m = 0 ; m < size (graph); ++m) {
28
14
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);
31
17
}
32
18
}
33
- Lookup color;
19
+ vector<vector<vector< int >>> color ( size (graph), vector<vector< int >>( size (graph), vector< int >( 2 ))) ;
34
20
queue<tuple<int , int , int , int >> q;
35
21
for (int i = 0 ; i < size (graph); ++i) {
36
22
if (i == HOLE) {
37
23
continue ;
38
24
}
39
- color[make_tuple ( HOLE, i, CAT) ] = MOUSE;
25
+ color[HOLE][i][ CAT - 1 ] = MOUSE;
40
26
q.emplace (HOLE, i, CAT, MOUSE);
41
27
for (const auto & t : {MOUSE, CAT}) {
42
- color[make_tuple (i, i, t) ] = CAT;
28
+ color[i][i][t - 1 ] = CAT;
43
29
q.emplace (i, i, t, CAT);
44
30
}
45
31
}
46
32
while (!empty (q)) {
47
33
const auto [i, j, t, c] = q.front (); q.pop ();
48
34
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) {
50
36
continue ;
51
37
}
52
38
if (nt == c) {
53
- color[make_tuple (ni, nj, nt) ] = c;
39
+ color[ni][nj][nt - 1 ] = c;
54
40
q.emplace (ni, nj, nt, c);
55
41
continue ;
56
42
}
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;
60
46
q.emplace (ni, nj, nt, c);
61
47
}
62
48
}
63
49
}
64
- return color[make_tuple ( MOUSE_START, CAT_START, MOUSE) ];
50
+ return color[MOUSE_START][ CAT_START][ MOUSE - 1 ];
65
51
}
66
52
67
53
private:
@@ -87,84 +73,70 @@ class Solution {
87
73
// Space: O(n^2)
88
74
class Solution2 {
89
75
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
-
104
76
enum Location {HOLE, MOUSE_START, CAT_START};
105
77
enum Result {DRAW, MOUSE, CAT};
106
78
107
79
public:
108
80
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 ))) ;
110
82
unordered_set<int > ignore (cbegin (graph[HOLE]), cend (graph[HOLE]));
111
83
for (int m = 0 ; m < size (graph); ++m) {
112
84
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);
115
87
}
116
88
}
117
- Lookup color;
89
+ vector<vector<vector< int >>> color ( size (graph), vector<vector< int >>( size (graph), vector< int >( 2 ))) ;
118
90
queue<tuple<int , int , int >> q1;
119
91
queue<tuple<int , int , int >> q2;
120
92
for (int i = 0 ; i < size (graph); ++i) {
121
93
if (i == HOLE) {
122
94
continue ;
123
95
}
124
- color[make_tuple ( HOLE, i, CAT) ] = MOUSE;
96
+ color[HOLE][i][ CAT - 1 ] = MOUSE;
125
97
q1.emplace (HOLE, i, CAT);
126
98
for (const auto & t : {MOUSE, CAT}) {
127
- color[make_tuple (i, i, t) ] = CAT;
99
+ color[i][i][t - 1 ] = CAT;
128
100
q2.emplace (i, i, t);
129
101
}
130
102
}
131
103
while (!empty (q1)) {
132
104
const auto [i, j, t] = q1.front (); q1.pop ();
133
105
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) {
135
107
continue ;
136
108
}
137
109
if (t == CAT) {
138
- color[make_tuple (ni, nj, nt) ] = MOUSE;
110
+ color[ni][nj][nt - 1 ] = MOUSE;
139
111
q1.emplace (ni, nj, nt);
140
112
continue ;
141
113
}
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;
145
117
q1.emplace (ni, nj, nt);
146
118
}
147
119
}
148
120
}
149
121
while (!empty (q2)) {
150
122
const auto [i, j, t] = q2.front (); q2.pop ();
151
123
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) {
153
125
continue ;
154
126
}
155
127
if (t == MOUSE) {
156
- color[make_tuple (ni, nj, nt) ] = CAT;
128
+ color[ni][nj][nt - 1 ] = CAT;
157
129
q2.emplace (ni, nj, nt);
158
130
continue ;
159
131
}
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;
163
135
q2.emplace (ni, nj, nt);
164
136
}
165
137
}
166
138
}
167
- return color[make_tuple ( MOUSE_START, CAT_START, MOUSE) ];
139
+ return color[MOUSE_START][ CAT_START][ MOUSE - 1 ];
168
140
}
169
141
170
142
private:
0 commit comments