Skip to content

Commit f2bed0e

Browse files
authored
Create 1728.Cat-and-Mouse-II.cpp
1 parent f7f02d4 commit f2bed0e

File tree

1 file changed

+165
-0
lines changed

1 file changed

+165
-0
lines changed
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
class Solution {
2+
int memo[9][9][9][9][3];
3+
pair<int,int>mouse;
4+
pair<int,int>cat;
5+
pair<int,int>food;
6+
int catJump;
7+
int mouseJump;
8+
public:
9+
bool canMouseWin(vector<string>& grid, int catJump, int mouseJump)
10+
{
11+
int m = grid.size();
12+
int n = grid[0].size();
13+
queue<array<int,5>>q;
14+
this->catJump = catJump;
15+
this->mouseJump = mouseJump;
16+
17+
for (int i=0; i<m; i++)
18+
for (int j=0; j<n; j++)
19+
{
20+
if (grid[i][j]=='M')
21+
mouse = {i,j};
22+
if (grid[i][j]=='C')
23+
cat = {i,j};
24+
if (grid[i][j]=='F')
25+
food = {i,j};
26+
}
27+
28+
for (int i=0; i<m; i++)
29+
for (int j=0; j<n; j++)
30+
{
31+
if (grid[i][j]=='#') continue;
32+
if (i==food.first && j==food.second) continue;
33+
memo[food.first][food.second][i][j][1] = 1; // mouse win
34+
memo[food.first][food.second][i][j][2] = 1; // mouse win
35+
memo[i][j][food.first][food.second][1] = 2; // cat win
36+
memo[i][j][food.first][food.second][2] = 2; // cat win
37+
q.push({food.first, food.second, i, j, 1});
38+
q.push({food.first, food.second, i, j, 2});
39+
q.push({i, j, food.first, food.second, 1});
40+
q.push({i, j, food.first, food.second, 2});
41+
}
42+
43+
for (int i=0; i<m; i++)
44+
for (int j=0; j<n; j++)
45+
{
46+
if (grid[i][j]=='#') continue;
47+
memo[i][j][i][j][1] = 2; // cat win
48+
memo[i][j][i][j][2] = 2; // cat win
49+
q.push({i, j, i, j, 1});
50+
q.push({i, j, i, j, 2});
51+
}
52+
53+
int step = 0;
54+
while (!q.empty())
55+
{
56+
step++;
57+
if (step>2000) return true;
58+
int len = q.size();
59+
while (len--)
60+
{
61+
int mx = q.front()[0];
62+
int my = q.front()[1];
63+
int cx = q.front()[2];
64+
int cy = q.front()[3];
65+
int t = q.front()[4];
66+
int status = memo[mx][my][cx][cy][t];
67+
q.pop();
68+
// cout<<mx<<" "<<my<<" "<<cx<<" "<<cy<<":"<<t<<":"<<memo[mx][my][cx][cy][t]<<endl;
69+
70+
for (auto nextNode: findAllParents(grid,mx,my,cx,cy,t))
71+
{
72+
int mx2 = nextNode[0];
73+
int my2 = nextNode[1];
74+
int cx2 = nextNode[2];
75+
int cy2 = nextNode[3];
76+
int t2 = nextNode[4];
77+
78+
if (memo[mx2][my2][cx2][cy2][t2]!=0) continue; // has been determined
79+
80+
if (t2==status) // immediate win, (m2,c2,t2)->(m,c,t)
81+
{
82+
memo[mx2][my2][cx2][cy2][t2] = status;
83+
q.push({mx2,my2,cx2,cy2,t2});
84+
}
85+
else if (allChildrenWin(grid, mx2,my2,cx2,cy2,t2)) // eventually lose
86+
{
87+
memo[mx2][my2][cx2][cy2][t2] = (t2==1)? 2:1;
88+
q.push({mx2,my2,cx2,cy2,t2});
89+
}
90+
}
91+
}
92+
}
93+
94+
cout<<memo[mouse.first][mouse.second][cat.first][cat.second][1]<<endl;
95+
return memo[mouse.first][mouse.second][cat.first][cat.second][1]==1;
96+
}
97+
98+
vector<vector<int>> findAllParents(vector<string>& grid, int mx, int my, int cx, int cy, int t)
99+
{
100+
int m = grid.size();
101+
int n = grid[0].size();
102+
auto dir = vector<pair<int,int>>({{1,0},{-1,0},{0,1},{0,-1}});
103+
vector<vector<int>>neighbours;
104+
if (t==1)
105+
{
106+
for (int k=0; k<4; k++)
107+
for (int a = 0; a<=catJump; a++)
108+
{
109+
int cx2 = cx+dir[k].first*a;
110+
int cy2 = cy+dir[k].second*a;
111+
if (cx2<0||cx2>=m||cy2<0||cy2>=n) break;
112+
if (grid[cx2][cy2]=='#') break;
113+
neighbours.push_back({mx,my,cx2,cy2,2});
114+
}
115+
}
116+
else
117+
{
118+
for (int k=0; k<4; k++)
119+
for (int a = 0; a<=mouseJump; a++)
120+
{
121+
int mx2 = mx+dir[k].first*a;
122+
int my2 = my+dir[k].second*a;
123+
if (mx2<0||mx2>=m||my2<0||my2>=n) break;
124+
if (grid[mx2][my2]=='#') break;
125+
neighbours.push_back({mx2,my2,cx,cy,1});
126+
}
127+
}
128+
return neighbours;
129+
}
130+
131+
bool allChildrenWin(vector<string>& grid, int mx, int my, int cx, int cy, int t)
132+
{
133+
int m = grid.size();
134+
int n = grid[0].size();
135+
auto dir = vector<pair<int,int>>({{1,0},{-1,0},{0,1},{0,-1}});
136+
137+
if (t==1)
138+
{
139+
for (int k=0; k<4; k++)
140+
for (int a = 0; a<=mouseJump; a++)
141+
{
142+
int mx2 = mx+dir[k].first*a;
143+
int my2 = my+dir[k].second*a;
144+
if (mx2<0||mx2>=m||my2<0||my2>=n) break;
145+
if (grid[mx2][my2]=='#') break;
146+
if (memo[mx2][my2][cx][cy][2]!=2)
147+
return false;
148+
}
149+
}
150+
else if (t==2)
151+
{
152+
for (int k=0; k<4; k++)
153+
for (int a = 0; a<=catJump; a++)
154+
{
155+
int cx2 = cx+dir[k].first*a;
156+
int cy2 = cy+dir[k].second*a;
157+
if (cx2<0||cx2>=m||cy2<0||cy2>=n) break;
158+
if (grid[cx2][cy2]=='#') break;
159+
if (memo[mx][my][cx2][cy2][1]!=1)
160+
return false;
161+
}
162+
}
163+
return true;
164+
}
165+
};

0 commit comments

Comments
 (0)