@@ -187,7 +187,6 @@ fn inner_part2(s: &[u8]) -> u64 {
187187 let mut min_cost = u32:: MAX ;
188188
189189 let mut prev = [ [ 0u32 ; 3 ] ; MAX_INDX * 4 ] ;
190- let mut lens = [ [ 0u32 ; 3 ] ; MAX_INDX * 4 ] ;
191190
192191 while let Some ( state) = to_see. pop ( ) {
193192 // println!("{}, {:?}", state.i, state.d);
@@ -207,8 +206,11 @@ fn inner_part2(s: &[u8]) -> u64 {
207206 if new_cost < costs[ get_idx ( new_i, new_d) ] {
208207 costs[ get_idx ( new_i, new_d) ] = new_cost;
209208
210- prev[ get_idx ( new_i, new_d) ] = [ get_idx ( state. i , state. d ) as u32 , 0 , 0 ] ;
211- lens[ get_idx ( new_i, new_d) ] = [ move_len - 1 , 0 , 0 ] ;
209+ prev[ get_idx ( new_i, new_d) ] = [
210+ get_idx ( state. i , state. d ) as u32 | ( move_len - 1 ) << 20 ,
211+ 0 ,
212+ 0 ,
213+ ] ;
212214
213215 let h = hueristic ( new_i, new_d) ;
214216 to_see
@@ -221,12 +223,12 @@ fn inner_part2(s: &[u8]) -> u64 {
221223 . unwrap ( ) ;
222224 } else if new_cost == costs[ get_idx ( new_i, new_d) ] {
223225 for i in 0 ..3 {
224- let p = prev[ get_idx ( new_i, new_d) ] [ i] ;
226+ let p = prev[ get_idx ( new_i, new_d) ] [ i] & 0xFFFFF ;
225227 if p == get_idx ( state. i , state. d ) as u32 {
226228 break ;
227229 } else if p == 0 {
228- prev[ get_idx ( new_i, new_d) ] [ i] = get_idx ( state . i , state . d ) as u32 ;
229- lens [ get_idx ( new_i , new_d ) ] [ i ] = move_len - 1 ;
230+ prev[ get_idx ( new_i, new_d) ] [ i] =
231+ get_idx ( state . i , state . d ) as u32 | ( move_len - 1 ) << 20 ;
230232 break ;
231233 }
232234 }
@@ -243,7 +245,6 @@ fn inner_part2(s: &[u8]) -> u64 {
243245 }
244246
245247 let mut visited_small = [ false ; MAX_INDX ] ;
246- let mut visited = [ false ; MAX_INDX * 4 ] ;
247248
248249 let mut stack = heapless:: Vec :: < u32 , 64 > :: new ( ) ;
249250 stack. push ( get_idx ( END , Direction :: E ) as u32 ) . unwrap ( ) ;
@@ -256,28 +257,28 @@ fn inner_part2(s: &[u8]) -> u64 {
256257 sum += 1 ;
257258 }
258259
259- if !visited[ i as usize ] {
260- visited[ i as usize ] = true ;
260+ let mut done = [ 0 ; 2 ] ;
261+ ' branches: for j in 0 ..3 {
262+ let prev = prev[ i as usize ] [ j] ;
263+ let len = prev >> 20 ;
264+ let prev = prev & 0xFFFFF ;
261265
262- let mut done = [ 0 ; 2 ] ;
263- ' branches: for j in 0 ..3 {
264- if prev[ i as usize ] [ j] != 0 {
265- let next_i = prev[ i as usize ] [ j] ;
266- stack. push ( next_i) . unwrap ( ) ;
266+ if prev != 0 {
267+ stack. push ( prev) . unwrap ( ) ;
267268
268- for l in 0 ..j {
269- if done[ l] == next_i % MAX_INDX as u32 {
270- continue ' branches;
271- }
269+ for l in 0 ..j {
270+ if done[ l] == prev % MAX_INDX as u32 {
271+ continue ' branches;
272272 }
273- done[ j] = next_i % MAX_INDX as u32 ;
274-
275- sum += lens[ i as usize ] [ j] ;
276- } else {
277- break ;
278273 }
274+ done[ j] = prev % MAX_INDX as u32 ;
275+
276+ sum += len;
277+ } else {
278+ break ;
279279 }
280280 }
281+ prev[ i as usize ] = [ 0 , 0 , 0 ] ;
281282 }
282283
283284 // for i in 0..(SIZE * SIZE1) - 1 {
0 commit comments