package Ġio . github . to mpl um . a oc . navigation . ch iton Ċ Ċ import Ġio . github . to mpl um . a oc . navigation . ch iton . strategy . C ave Generation Strategy Ċ import Ġio . github . to mpl um . libs . math . point . Point 2 D Ċ import Ġjava . util .* Ċ Ċ class ĠC ave Navigator ( data : ĠList < String >, Ġstrategy : ĠC ave Generation Strategy ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġca ver n Ġ= Ġstrategy . generate ( data ) ĊĊĠĠĠ Ġfun Ġcalculate Low est Risk Path (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠPoint 2 D . origin () ĊĠĠĠĠĠĠĠ Ġval Ġnext : ĠQueue < Point 2 D > Ġ= ĠLinkedList ( listOf ( origin )) ĊĠĠĠĠĠĠĠ Ġval Ġshortest Ġ= Ġmutable Map Of ( origin Ġto Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġca ver n . getData Map (). map Ġ{ Ġit . key Ġto Ġit . value . risk Ġ}. toMap () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( next . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġnext . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance To Current Ġ= Ġshortest [ current ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . orth og on ally Adjacent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġpos Ġ-> Ġmap [ pos ] Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġpos Ġ-> Ġmap [ pos ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Distance Ġ= Ġdistance To Current Ġ+ Ġmap [ pos ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( short est [ pos ] Ġ== Ġnull Ġ|| Ġshortest [ pos ] !! Ġ> Ġnew Distance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshortest [ pos ] Ġ= Ġnew Distance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . add ( pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġshortest . values . last () ĊĠĠĠ Ġ} Ċ } Ċ