1+ import java .util .LinkedList ;
2+ import java .util .Queue ;
3+
4+ public class Solution1210 {
5+ private static final int [][] DIRS = {{1 , 0 , 0 }, {0 , 1 , 0 }, {0 , 0 , 1 }};
6+
7+ public int minimumMoves (int [][] grid ) {
8+ int n = grid .length ;
9+ boolean [][][] visited = new boolean [n ][n ][2 ];
10+ Queue <int []> queue = new LinkedList <>();
11+ visited [0 ][0 ][0 ] = true ;
12+ queue .add (new int []{0 , 0 , 0 });
13+ int step = 0 ;
14+ while (!queue .isEmpty ()) {
15+ int size = queue .size ();
16+ for (int i = 0 ; i < size ; i ++) {
17+ int [] cur = queue .remove ();
18+ if (cur [0 ] == n - 1 && cur [1 ] == n - 2 ) {
19+ return step ;
20+ }
21+ for (int [] dir : DIRS ) {
22+ int x = cur [0 ] + dir [0 ];
23+ int y = cur [1 ] + dir [1 ];
24+ int s = cur [2 ] ^ dir [2 ];
25+ int x2 = x + s ;
26+ int y2 = y + (s ^ 1 );
27+ if (x2 < n && y2 < n && !visited [x ][y ][s ]
28+ && grid [x ][y ] == 0 && grid [x2 ][y2 ] == 0
29+ && (dir [2 ] == 0 || grid [x + 1 ][y + 1 ] == 0 )) {
30+ visited [x ][y ][s ] = true ;
31+ queue .add (new int []{x , y , s });
32+ }
33+ }
34+ }
35+ step ++;
36+ }
37+ return -1 ;
38+ }
39+ }
40+ /*
41+ 1210. 穿过迷宫的最少移动次数
42+ https://leetcode.cn/problems/minimum-moves-to-reach-target-with-rotations/
43+
44+ 你还记得那条风靡全球的贪吃蛇吗?
45+ 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。蛇会从左上角((0, 0) 和 (0, 1))开始移动。我们用 0 表示空单元格,用 1 表示障碍物。蛇需要移动到迷宫的右下角((n-1, n-2) 和 (n-1, n-1))。
46+ 每次移动,蛇可以这样走:
47+ - 如果没有障碍,则向右移动一个单元格。并仍然保持身体的水平/竖直状态。
48+ - 如果没有障碍,则向下移动一个单元格。并仍然保持身体的水平/竖直状态。
49+ - 如果它处于水平状态并且其下面的两个单元都是空的,就顺时针旋转 90 度。蛇从((r, c)、(r, c+1))移动到 ((r, c)、(r+1, c))。
50+ - 如果它处于竖直状态并且其右面的两个单元都是空的,就逆时针旋转 90 度。蛇从((r, c)、(r+1, c))移动到((r, c)、(r, c+1))。
51+ 返回蛇抵达目的地所需的最少移动次数。
52+ 如果无法到达目的地,请返回 -1。
53+ 提示:
54+ 2 <= n <= 100
55+ 0 <= grid[i][j] <= 1
56+ 蛇保证从空单元格开始出发。
57+
58+ https://leetcode.cn/problems/minimum-moves-to-reach-target-with-rotations/solution/huan-zai-if-elseyi-ge-xun-huan-chu-li-li-tw8b/
59+ 时间复杂度 O(n^2)
60+ 空间复杂度 O(n^2)
61+ */
0 commit comments