11package g3501_3600 .s3552_grid_teleportation_traversal ;
22
3- // #Medium #2025_05_18_Time_133_ms_ (99.44%)_Space_60.94_MB_(99.44 %)
3+ // #Medium #2025_05_18_Time_139_ms_ (99.44%)_Space_61.40_MB_(98.89 %)
44
55import java .util .ArrayList ;
66import java .util .LinkedList ;
1111public class Solution {
1212 private static final int [][] ADJACENT = new int [][] {{0 , 1 }, {1 , 0 }, {-1 , 0 }, {0 , -1 }};
1313
14- public int minMoves (String [] matrix ) {
15- int m = matrix .length ;
16- int n = matrix [0 ].length ();
17- if ((m == 1 && n == 1 )
18- || (matrix [0 ].charAt (0 ) != '.'
19- && matrix [m - 1 ].charAt (n - 1 ) == matrix [0 ].charAt (0 ))) {
20- return 0 ;
21- }
14+ private List <int []>[] initializePortals (int m , int n , String [] matrix ) {
2215 List <int []>[] portalsToPositions = new ArrayList [26 ];
2316 for (int i = 0 ; i < 26 ; i ++) {
2417 portalsToPositions [i ] = new ArrayList <>();
@@ -31,8 +24,14 @@ public int minMoves(String[] matrix) {
3124 }
3225 }
3326 }
34- boolean [][] visited = new boolean [m ][n ];
35- Queue <int []> queue = new LinkedList <>();
27+ return portalsToPositions ;
28+ }
29+
30+ private void initializeQueue (
31+ Queue <int []> queue ,
32+ boolean [][] visited ,
33+ String [] matrix ,
34+ List <int []>[] portalsToPositions ) {
3635 if (matrix [0 ].charAt (0 ) != '.' ) {
3736 int idx = matrix [0 ].charAt (0 ) - 'A' ;
3837 for (int [] pos : portalsToPositions [idx ]) {
@@ -43,6 +42,46 @@ public int minMoves(String[] matrix) {
4342 queue .offer (new int [] {0 , 0 });
4443 }
4544 visited [0 ][0 ] = true ;
45+ }
46+
47+ private boolean isValidMove (int r , int c , int m , int n , boolean [][] visited , String [] matrix ) {
48+ return !(r < 0 || r == m || c < 0 || c == n || visited [r ][c ] || matrix [r ].charAt (c ) == '#' );
49+ }
50+
51+ private boolean processPortal (
52+ int r ,
53+ int c ,
54+ int m ,
55+ int n ,
56+ Queue <int []> queue ,
57+ boolean [][] visited ,
58+ String [] matrix ,
59+ List <int []>[] portalsToPositions ) {
60+ int idx = matrix [r ].charAt (c ) - 'A' ;
61+ for (int [] pos : portalsToPositions [idx ]) {
62+ if (pos [0 ] == m - 1 && pos [1 ] == n - 1 ) {
63+ return true ;
64+ }
65+ queue .offer (pos );
66+ visited [pos [0 ]][pos [1 ]] = true ;
67+ }
68+ return false ;
69+ }
70+
71+ public int minMoves (String [] matrix ) {
72+ int m = matrix .length ;
73+ int n = matrix [0 ].length ();
74+ if ((m == 1 && n == 1 )
75+ || (matrix [0 ].charAt (0 ) != '.'
76+ && matrix [m - 1 ].charAt (n - 1 ) == matrix [0 ].charAt (0 ))) {
77+ return 0 ;
78+ }
79+
80+ List <int []>[] portalsToPositions = initializePortals (m , n , matrix );
81+ boolean [][] visited = new boolean [m ][n ];
82+ Queue <int []> queue = new LinkedList <>();
83+ initializeQueue (queue , visited , matrix , portalsToPositions );
84+
4685 int moves = 0 ;
4786 while (!queue .isEmpty ()) {
4887 int sz = queue .size ();
@@ -51,22 +90,12 @@ public int minMoves(String[] matrix) {
5190 for (int [] adj : ADJACENT ) {
5291 int r = adj [0 ] + curr [0 ];
5392 int c = adj [1 ] + curr [1 ];
54- if (r < 0
55- || r == m
56- || c < 0
57- || c == n
58- || visited [r ][c ]
59- || matrix [r ].charAt (c ) == '#' ) {
93+ if (!isValidMove (r , c , m , n , visited , matrix )) {
6094 continue ;
6195 }
6296 if (matrix [r ].charAt (c ) != '.' ) {
63- int idx = matrix [r ].charAt (c ) - 'A' ;
64- for (int [] pos : portalsToPositions [idx ]) {
65- if (pos [0 ] == m - 1 && pos [1 ] == n - 1 ) {
66- return moves + 1 ;
67- }
68- queue .offer (pos );
69- visited [pos [0 ]][pos [1 ]] = true ;
97+ if (processPortal (r , c , m , n , queue , visited , matrix , portalsToPositions )) {
98+ return moves + 1 ;
7099 }
71100 } else {
72101 if (r == m - 1 && c == n - 1 ) {
0 commit comments