1
- use std:: collections:: { BTreeSet , HashMap } ;
1
+ use std:: collections:: BTreeSet ;
2
2
use std:: io:: Read ;
3
3
4
4
fn main ( ) {
@@ -28,11 +28,11 @@ fn main() {
28
28
29
29
let start_f_score = h ( start) ;
30
30
31
- let mut f_scores = HashMap :: new ( ) ;
32
- f_scores. insert ( start, start_f_score) ;
31
+ let mut f_scores: Vec < Vec < _ > > = map . iter ( ) . map ( |row| row . iter ( ) . map ( |_| 0 ) . collect ( ) ) . collect ( ) ;
32
+ f_scores[ start[ 0 ] as usize ] [ start [ 1 ] as usize ] = start_f_score;
33
33
34
- let mut g_scores = HashMap :: new ( ) ;
35
- g_scores. insert ( start, 0 ) ;
34
+ let mut g_scores: Vec < Vec < _ > > = map . iter ( ) . map ( |row| row . iter ( ) . map ( |_| None ) . collect ( ) ) . collect ( ) ;
35
+ g_scores[ start[ 0 ] as usize ] [ start [ 1 ] as usize ] = Some ( 0 ) ;
36
36
37
37
let mut open_set = BTreeSet :: new ( ) ;
38
38
open_set. insert ( ( start_f_score, start) ) ;
@@ -45,7 +45,7 @@ fn main() {
45
45
println ! ( "{}" , f_score) ;
46
46
break ;
47
47
}
48
- let g_score = g_scores[ & pos] ;
48
+ let g_score = g_scores[ pos[ 0 ] as usize ] [ pos [ 1 ] as usize ] . unwrap ( ) ;
49
49
let old_height = map[ pos[ 0 ] as usize ] [ pos[ 1 ] as usize ] ;
50
50
51
51
for delta in [
@@ -64,15 +64,15 @@ fn main() {
64
64
continue ;
65
65
}
66
66
let tentative_g_score = g_score + 1 ;
67
- let old_g_score = g_scores. get ( & new_pos) . copied ( ) ;
67
+ let old_g_score = g_scores[ new_pos[ 0 ] as usize ] [ new_pos [ 1 ] as usize ] ;
68
68
if tentative_g_score < old_g_score. unwrap_or ( i16:: MAX ) {
69
69
if old_g_score. is_some ( ) {
70
- open_set. remove ( & ( f_scores[ & new_pos] , new_pos) ) ;
70
+ open_set. remove ( & ( f_scores[ new_pos[ 0 ] as usize ] [ new_pos [ 1 ] as usize ] , new_pos) ) ;
71
71
}
72
72
73
73
let new_f_score = tentative_g_score + h ( new_pos) ;
74
- f_scores. insert ( new_pos, new_f_score) ;
75
- g_scores. insert ( new_pos, tentative_g_score) ;
74
+ f_scores[ new_pos[ 0 ] as usize ] [ new_pos [ 1 ] as usize ] = new_f_score;
75
+ g_scores[ new_pos[ 0 ] as usize ] [ new_pos [ 1 ] as usize ] = Some ( tentative_g_score) ;
76
76
open_set. insert ( ( new_f_score, new_pos) ) ;
77
77
}
78
78
}
0 commit comments