Skip to content

Commit 4288f4a

Browse files
committed
feat: add solutions to lc problem: No.1210
No.1210.Minimum Moves to Reach Target with Rotations
1 parent 76a25b4 commit 4288f4a

File tree

8 files changed

+659
-270
lines changed

8 files changed

+659
-270
lines changed

solution/1200-1299/1210.Minimum Moves to Reach Target with Rotations/README.md

Lines changed: 249 additions & 90 deletions
Large diffs are not rendered by default.

solution/1200-1299/1210.Minimum Moves to Reach Target with Rotations/README_EN.md

Lines changed: 210 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,18 @@ BFS.
7070
```python
7171
class Solution:
7272
def minimumMoves(self, grid: List[List[int]]) -> int:
73-
def check(a, b):
74-
if (a, b) not in vis:
75-
vis.add((a, b))
76-
q.append((a, b))
73+
def move(i1, j1, i2, j2):
74+
if 0 <= i1 < n and 0 <= j1 < n and 0 <= i2 < n and 0 <= j2 < n:
75+
a, b = i1 * n + j1, i2 * n + j2
76+
status = 0 if i1 == i2 else 1
77+
if (a, status) not in vis and grid[i1][j1] == 0 and grid[i2][j2] == 0:
78+
q.append((a, b))
79+
vis.add((a, status))
7780

7881
n = len(grid)
7982
target = (n * n - 2, n * n - 1)
8083
q = deque([(0, 1)])
81-
vis = {(0, 1)}
84+
vis = {(0, 0)}
8285
ans = 0
8386
while q:
8487
for _ in range(len(q)):
@@ -87,24 +90,12 @@ class Solution:
8790
return ans
8891
i1, j1 = a // n, a % n
8992
i2, j2 = b // n, b % n
90-
if (
91-
j1 + 1 < n
92-
and j2 + 1 < n
93-
and grid[i1][j1 + 1] == 0
94-
and grid[i2][j2 + 1] == 0
95-
):
96-
check(i1 * n + j1 + 1, i2 * n + j2 + 1)
97-
if j1 == j2:
98-
check(a, i1 * n + j2 + 1)
99-
if (
100-
i1 + 1 < n
101-
and i2 + 1 < n
102-
and grid[i1 + 1][j1] == 0
103-
and grid[i2 + 1][j2] == 0
104-
):
105-
check((i1 + 1) * n + j1, (i2 + 1) * n + j2)
106-
if i1 == i2:
107-
check(a, (i2 + 1) * n + j1)
93+
move(i1, j1 + 1, i2, j2 + 1)
94+
move(i1 + 1, j1, i2 + 1, j2)
95+
if i1 == i2 and i1 + 1 < n and grid[i1 + 1][j2] == 0:
96+
move(i1, j1, i1 + 1, j1)
97+
if j1 == j2 and j1 + 1 < n and grid[i2][j1 + 1] == 0:
98+
move(i1, j1, i1, j1 + 1)
10899
ans += 1
109100
return -1
110101
```
@@ -113,45 +104,49 @@ class Solution:
113104

114105
```java
115106
class Solution {
107+
private int n;
108+
private int[][] grid;
109+
private boolean[][] vis;
110+
private Deque<int[]> q = new ArrayDeque<>();
111+
116112
public int minimumMoves(int[][] grid) {
117-
int n = grid.length;
118-
int[] target = new int[] {n * n - 2, n * n - 1};
119-
Deque<int[]> q = new ArrayDeque<>();
113+
this.grid = grid;
114+
n = grid.length;
115+
vis = new boolean[n * n][2];
116+
int[] target = {n * n - 2, n * n - 1};
120117
q.offer(new int[] {0, 1});
121-
boolean[][] vis = new boolean[n * n][n * n];
118+
vis[0][0] = true;
122119
int ans = 0;
123-
vis[0][1] = true;
124120
while (!q.isEmpty()) {
125121
for (int k = q.size(); k > 0; --k) {
126-
int[] p = q.poll();
122+
var p = q.poll();
127123
if (p[0] == target[0] && p[1] == target[1]) {
128124
return ans;
129125
}
130-
int a = p[0], b = p[1];
131-
int i1 = a / n, j1 = a % n;
132-
int i2 = b / n, j2 = b % n;
133-
if (j1 + 1 < n && j2 + 1 < n && grid[i1][j1 + 1] == 0 && grid[i2][j2 + 1] == 0) {
134-
check(i1 * n + j1 + 1, i2 * n + j2 + 1, q, vis);
135-
if (j1 == j2) {
136-
check(a, i1 * n + j2 + 1, q, vis);
137-
}
126+
int i1 = p[0] / n, j1 = p[0] % n;
127+
int i2 = p[1] / n, j2 = p[1] % n;
128+
move(i1, j1 + 1, i2, j2 + 1);
129+
move(i1 + 1, j1, i2 + 1, j2);
130+
if (i1 == i2 && i1 + 1 < n && grid[i1 + 1][j2] == 0) {
131+
move(i1, j1, i1 + 1, j1);
138132
}
139-
if (i1 + 1 < n && i2 + 1 < n && grid[i1 + 1][j1] == 0 && grid[i2 + 1][j2] == 0) {
140-
check((i1 + 1) * n + j1, (i2 + 1) * n + j2, q, vis);
141-
if (i1 == i2) {
142-
check(a, (i2 + 1) * n + j1, q, vis);
143-
}
133+
if (j1 == j2 && j1 + 1 < n && grid[i2][j1 + 1] == 0) {
134+
move(i1, j1, i1, j1 + 1);
144135
}
145136
}
146137
++ans;
147138
}
148139
return -1;
149140
}
150141

151-
private void check(int a, int b, Deque<int[]> q, boolean[][] vis) {
152-
if (!vis[a][b]) {
153-
vis[a][b] = true;
154-
q.offer(new int[] {a, b});
142+
private void move(int i1, int j1, int i2, int j2) {
143+
if (i1 >= 0 && i1 < n && j1 >= 0 && j1 < n && i2 >= 0 && i2 < n && j2 >= 0 && j2 < n) {
144+
int a = i1 * n + j1, b = i2 * n + j2;
145+
int status = i1 == i2 ? 0 : 1;
146+
if (!vis[a][status] && grid[i1][j1] == 0 && grid[i2][j2] == 0) {
147+
q.offer(new int[] {a, b});
148+
vis[a][status] = true;
149+
}
155150
}
156151
}
157152
}
@@ -164,40 +159,48 @@ class Solution {
164159
public:
165160
int minimumMoves(vector<vector<int>>& grid) {
166161
int n = grid.size();
167-
vector<int> target = {n * n - 2, n * n - 1};
168-
queue<vector<int>> q;
169-
q.push({0, 1});
170-
vector<vector<bool>> vis(n * n, vector<bool>(n * n));
162+
auto target = make_pair(n * n - 2, n * n - 1);
163+
queue<pair<int, int>> q;
164+
q.emplace(0, 1);
165+
bool vis[n * n][2];
166+
memset(vis, 0, sizeof vis);
167+
vis[0][0] = true;
168+
169+
auto move = [&](int i1, int j1, int i2, int j2) {
170+
if (i1 >= 0 && i1 < n && j1 >= 0 && j1 < n && i2 >= 0 && i2 < n && j2 >= 0 && j2 < n) {
171+
int a = i1 * n + j1, b = i2 * n + j2;
172+
int status = i1 == i2 ? 0 : 1;
173+
if (!vis[a][status] && grid[i1][j1] == 0 && grid[i2][j2] == 0) {
174+
q.emplace(a, b);
175+
vis[a][status] = true;
176+
}
177+
}
178+
};
179+
171180
int ans = 0;
172-
vis[0][1] = true;
173181
while (!q.empty()) {
174182
for (int k = q.size(); k; --k) {
175183
auto p = q.front();
176-
if (p == target) return ans;
177184
q.pop();
178-
int a = p[0], b = p[1];
185+
if (p == target) {
186+
return ans;
187+
}
188+
auto [a, b] = p;
179189
int i1 = a / n, j1 = a % n;
180190
int i2 = b / n, j2 = b % n;
181-
if (j1 + 1 < n && j2 + 1 < n && grid[i1][j1 + 1] == 0 && grid[i2][j2 + 1] == 0) {
182-
check(i1 * n + j1 + 1, i2 * n + j2 + 1, q, vis);
183-
if (j1 == j2) check(a, i1 * n + j2 + 1, q, vis);
191+
move(i1, j1 + 1, i2, j2 + 1);
192+
move(i1 + 1, j1, i2 + 1, j2);
193+
if (i1 == i2 && i1 + 1 < n && grid[i1 + 1][j2] == 0) {
194+
move(i1, j1, i1 + 1, j1);
184195
}
185-
if (i1 + 1 < n && i2 + 1 < n && grid[i1 + 1][j1] == 0 && grid[i2 + 1][j2] == 0) {
186-
check((i1 + 1) * n + j1, (i2 + 1) * n + j2, q, vis);
187-
if (i1 == i2) check(a, (i2 + 1) * n + j1, q, vis);
196+
if (j1 == j2 && j1 + 1 < n && grid[i2][j1 + 1] == 0) {
197+
move(i1, j1, i1, j1 + 1);
188198
}
189199
}
190200
++ans;
191201
}
192202
return -1;
193203
}
194-
195-
void check(int a, int b, queue<vector<int>>& q, vector<vector<bool>>& vis) {
196-
if (!vis[a][b]) {
197-
vis[a][b] = true;
198-
q.push({a, b});
199-
}
200-
}
201204
};
202205
```
203206
@@ -206,41 +209,44 @@ public:
206209
```go
207210
func minimumMoves(grid [][]int) int {
208211
n := len(grid)
209-
target := []int{n*n - 2, n*n - 1}
210-
q := [][]int{{0, 1}}
211-
vis := make([][]bool, n*n)
212-
for i := range vis {
213-
vis[i] = make([]bool, n*n)
214-
}
215-
vis[0][1] = true
216-
ans := 0
217-
check := func(a, b int) {
218-
if !vis[a][b] {
219-
vis[a][b] = true
220-
q = append(q, []int{a, b})
212+
type pair struct{ a, b int }
213+
target := pair{n*n - 2, n*n - 1}
214+
q := []pair{pair{0, 1}}
215+
vis := make([][2]bool, n*n)
216+
vis[0][0] = true
217+
218+
move := func(i1, j1, i2, j2 int) {
219+
if i1 >= 0 && i1 < n && j1 >= 0 && j1 < n && i2 >= 0 && i2 < n && j2 >= 0 && j2 < n {
220+
a, b := i1*n+j1, i2*n+j2
221+
status := 1
222+
if i1 == i2 {
223+
status = 0
224+
}
225+
if !vis[a][status] && grid[i1][j1] == 0 && grid[i2][j2] == 0 {
226+
q = append(q, pair{a, b})
227+
vis[a][status] = true
228+
}
221229
}
222230
}
231+
232+
ans := 0
223233
for len(q) > 0 {
224234
for k := len(q); k > 0; k-- {
225235
p := q[0]
226236
q = q[1:]
227-
if p[0] == target[0] && p[1] == target[1] {
237+
if p == target {
228238
return ans
229239
}
230-
a, b := p[0], p[1]
240+
a, b := p.a, p.b
231241
i1, j1 := a/n, a%n
232242
i2, j2 := b/n, b%n
233-
if j1+1 < n && j2+1 < n && grid[i1][j1+1] == 0 && grid[i2][j2+1] == 0 {
234-
check(i1*n+j1+1, i2*n+j2+1)
235-
if j1 == j2 {
236-
check(a, i1*n+j2+1)
237-
}
243+
move(i1, j1+1, i2, j2+1)
244+
move(i1+1, j1, i2+1, j2)
245+
if i1 == i2 && i1+1 < n && grid[i1+1][j2] == 0 {
246+
move(i1, j1, i1+1, j1)
238247
}
239-
if i1+1 < n && i2+1 < n && grid[i1+1][j1] == 0 && grid[i2+1][j2] == 0 {
240-
check((i1+1)*n+j1, (i2+1)*n+j2)
241-
if i1 == i2 {
242-
check(a, (i2+1)*n+j1)
243-
}
248+
if j1 == j2 && j1+1 < n && grid[i2][j1+1] == 0 {
249+
move(i1, j1, i1, j1+1)
244250
}
245251
}
246252
ans++
@@ -249,6 +255,120 @@ func minimumMoves(grid [][]int) int {
249255
}
250256
```
251257

258+
### **TypeScript**
259+
260+
```ts
261+
function minimumMoves(grid: number[][]): number {
262+
const n = grid.length;
263+
const target: number[] = [n * n - 2, n * n - 1];
264+
const q: number[][] = [[0, 1]];
265+
const vis = Array.from({ length: n * n }, () => Array(2).fill(false));
266+
vis[0][0] = true;
267+
268+
const move = (i1: number, j1: number, i2: number, j2: number) => {
269+
if (
270+
i1 >= 0 &&
271+
i1 < n &&
272+
j1 >= 0 &&
273+
j1 < n &&
274+
i2 >= 0 &&
275+
i2 < n &&
276+
j2 >= 0 &&
277+
j2 < n
278+
) {
279+
const a = i1 * n + j1;
280+
const b = i2 * n + j2;
281+
const status = i1 === i2 ? 0 : 1;
282+
if (!vis[a][status] && grid[i1][j1] == 0 && grid[i2][j2] == 0) {
283+
q.push([a, b]);
284+
vis[a][status] = true;
285+
}
286+
}
287+
};
288+
289+
let ans = 0;
290+
while (q.length) {
291+
for (let k = q.length; k; --k) {
292+
const p: number[] = q.shift();
293+
if (p[0] === target[0] && p[1] === target[1]) {
294+
return ans;
295+
}
296+
const [i1, j1] = [~~(p[0] / n), p[0] % n];
297+
const [i2, j2] = [~~(p[1] / n), p[1] % n];
298+
move(i1, j1 + 1, i2, j2 + 1);
299+
move(i1 + 1, j1, i2 + 1, j2);
300+
if (i1 == i2 && i1 + 1 < n && grid[i1 + 1][j2] == 0) {
301+
move(i1, j1, i1 + 1, j1);
302+
}
303+
if (j1 == j2 && j1 + 1 < n && grid[i2][j1 + 1] == 0) {
304+
move(i1, j1, i1, j1 + 1);
305+
}
306+
}
307+
++ans;
308+
}
309+
return -1;
310+
}
311+
```
312+
313+
### **JavaScript**
314+
315+
```js
316+
/**
317+
* @param {number[][]} grid
318+
* @return {number}
319+
*/
320+
var minimumMoves = function (grid) {
321+
const n = grid.length;
322+
const target = [n * n - 2, n * n - 1];
323+
const q = [[0, 1]];
324+
const vis = Array.from({ length: n * n }, () => Array(2).fill(false));
325+
vis[0][0] = true;
326+
327+
const move = (i1, j1, i2, j2) => {
328+
if (
329+
i1 >= 0 &&
330+
i1 < n &&
331+
j1 >= 0 &&
332+
j1 < n &&
333+
i2 >= 0 &&
334+
i2 < n &&
335+
j2 >= 0 &&
336+
j2 < n
337+
) {
338+
const a = i1 * n + j1;
339+
const b = i2 * n + j2;
340+
const status = i1 === i2 ? 0 : 1;
341+
if (!vis[a][status] && grid[i1][j1] == 0 && grid[i2][j2] == 0) {
342+
q.push([a, b]);
343+
vis[a][status] = true;
344+
}
345+
}
346+
};
347+
348+
let ans = 0;
349+
while (q.length) {
350+
for (let k = q.length; k; --k) {
351+
const p = q.shift();
352+
if (p[0] === target[0] && p[1] === target[1]) {
353+
return ans;
354+
}
355+
const [i1, j1] = [~~(p[0] / n), p[0] % n];
356+
const [i2, j2] = [~~(p[1] / n), p[1] % n];
357+
move(i1, j1 + 1, i2, j2 + 1);
358+
move(i1 + 1, j1, i2 + 1, j2);
359+
if (i1 == i2 && i1 + 1 < n && grid[i1 + 1][j2] == 0) {
360+
move(i1, j1, i1 + 1, j1);
361+
}
362+
if (j1 == j2 && j1 + 1 < n && grid[i2][j1 + 1] == 0) {
363+
move(i1, j1, i1, j1 + 1);
364+
}
365+
}
366+
++ans;
367+
}
368+
return -1;
369+
};
370+
```
371+
252372
### **...**
253373

254374
```

0 commit comments

Comments
 (0)