70
70
``` python
71
71
class Solution :
72
72
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))
77
80
78
81
n = len (grid)
79
82
target = (n * n - 2 , n * n - 1 )
80
83
q = deque([(0 , 1 )])
81
- vis = {(0 , 1 )}
84
+ vis = {(0 , 0 )}
82
85
ans = 0
83
86
while q:
84
87
for _ in range (len (q)):
@@ -87,24 +90,12 @@ class Solution:
87
90
return ans
88
91
i1, j1 = a // n, a % n
89
92
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 )
108
99
ans += 1
109
100
return - 1
110
101
```
@@ -113,45 +104,49 @@ class Solution:
113
104
114
105
``` java
115
106
class Solution {
107
+ private int n;
108
+ private int [][] grid;
109
+ private boolean [][] vis;
110
+ private Deque<int[]> q = new ArrayDeque<> ();
111
+
116
112
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 };
120
117
q. offer(new int [] {0 , 1 });
121
- boolean [][] vis = new boolean [n * n][n * n] ;
118
+ vis[ 0 ][ 0 ] = true ;
122
119
int ans = 0 ;
123
- vis[0 ][1 ] = true ;
124
120
while (! q. isEmpty()) {
125
121
for (int k = q. size(); k > 0 ; -- k) {
126
- int [] p = q. poll();
122
+ var p = q. poll();
127
123
if (p[0 ] == target[0 ] && p[1 ] == target[1 ]) {
128
124
return ans;
129
125
}
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);
138
132
}
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 );
144
135
}
145
136
}
146
137
++ ans;
147
138
}
148
139
return - 1 ;
149
140
}
150
141
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
+ }
155
150
}
156
151
}
157
152
}
@@ -164,40 +159,48 @@ class Solution {
164
159
public:
165
160
int minimumMoves(vector<vector<int >>& grid) {
166
161
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
+
171
180
int ans = 0;
172
- vis[ 0] [ 1 ] = true;
173
181
while (!q.empty()) {
174
182
for (int k = q.size(); k; --k) {
175
183
auto p = q.front();
176
- if (p == target) return ans;
177
184
q.pop();
178
- int a = p[ 0] , b = p[ 1] ;
185
+ if (p == target) {
186
+ return ans;
187
+ }
188
+ auto [a, b] = p;
179
189
int i1 = a / n, j1 = a % n;
180
190
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);
184
195
}
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);
188
198
}
189
199
}
190
200
++ans;
191
201
}
192
202
return -1;
193
203
}
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
- }
201
204
};
202
205
```
203
206
@@ -206,41 +209,44 @@ public:
206
209
```go
207
210
func minimumMoves(grid [][]int) int {
208
211
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
+ }
221
229
}
222
230
}
231
+
232
+ ans := 0
223
233
for len(q) > 0 {
224
234
for k := len(q); k > 0; k-- {
225
235
p := q[0]
226
236
q = q[1:]
227
- if p[ 0 ] == target[ 0 ] && p[ 1 ] == target[ 1 ] {
237
+ if p == target {
228
238
return ans
229
239
}
230
- a , b := p[ 0 ] , p[ 1 ]
240
+ a, b := p.a , p.b
231
241
i1, j1 := a/n, a%n
232
242
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)
238
247
}
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)
244
250
}
245
251
}
246
252
ans++
@@ -249,6 +255,120 @@ func minimumMoves(grid [][]int) int {
249
255
}
250
256
```
251
257
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
+
252
372
### ** ...**
253
373
254
374
```
0 commit comments