package Ġio . queue Ċ Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashSet ĊĊ Ċ // https :// leetcode . com / explore / learn / card / queue - stack / 2 3 1 / pract ical - application - queue / 1 3 7 5 / Ċ class ĠOpen The Lock Ġ{ ĊĠ Ġprivate Ġval Ġinitial Ġ= ĠlistOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠ Ġprivate Ġval Ġerror Ġ= Ġ- 1 ĊĊĠ Ġfun Ġexecute ( dead End s : ĠArray < String >, Ġgoal : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġstart Ġ= Ġinitial ĊĠĠĠ Ġval Ġtarget Ġ= Ġgoal . lock ArrayList Of Int () ĊĠĠĠ Ġval Ġavoid Ġ= Ġdead End s . map Ġ{ Ġit . lock ArrayList Of Int () Ġ}. toSet () ĊĊĠĠĠ Ġif Ġ( start Ġin Ġavoid ) ĊĠĠĠĠĠ Ġreturn Ġerror ĊĊĠĠĠ Ġvar Ġdistance Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġto Visit Ġ= ĠlistOf ( start ) ĊĠĠĠ Ġval Ġvisited Ġ= ĠHashSet < List < Int >>() ĊĊĠĠĠ Ġwhile Ġ( to Visit . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġnext To Visit Ġ= Ġmutable ListOf < List < Int >>() ĊĊĠĠĠĠĠ Ġfor Ġ( node Ġin Ġto Visit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġ== Ġtarget ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġdistance ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġretrieve Ne ighbours ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ! in Ġvisited Ġ&& Ġn Ġ! in Ġavoid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisited . add ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext To Visit . add ( n ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġto Visit Ġ= Ġnext To Visit ĊĠĠĠĠĠ Ġdistance Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġerror ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġretrieve Ne ighbours ( current : ĠList < Int >) Ġ= Ġarray ListOf < List < Int >> (). apply Ġ{ ĊĠĠĠ Ġ( 0 .. 3 ). map Ġ{ Ġi Ġ-> ĊĠĠĠĠĠ Ġval Ġnext Ġ= ĠArrayList ( current ) ĊĠĠĠĠĠ Ġnext [ i ] Ġ= Ġ( current [ i ] Ġ+ Ġ 1 ) Ġ% Ġ 1 0 ĊĠĠĠĠĠ Ġadd ( ArrayList ( next )) ĊĠĠĠĠĠ Ġnext [ i ] Ġ= Ġ( current [ i ] Ġ+ Ġ 9 ) Ġ% Ġ 1 0 ĊĠĠĠĠĠ Ġadd ( next ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġprivate Ġfun ĠString . lock ArrayList Of Int () Ġ= Ġ( 0 .. 3 ). map Ġ{ ĠCharacter . get Numeric Value ( this [ it ]) Ġ} Ċ } ĊĊ Ċ fun Ġmain () Ġ{ ĊĠ Ġval Ġopen The Lock Ġ= ĠOpen The Lock () ĊĠ ĠlistOf ( ĊĠĠĠĠĠ ĠHelp ( dead End s Ġ= ĠarrayOf (" 0 2 0 1 ", Ġ" 0 1 0 1 ", Ġ" 0 1 0 2 ", Ġ" 1 2 1 2 ", Ġ" 2 0 0 2 "), Ġtarget Ġ= Ġ" 0 2 0 2 ", Ġoutput Ġ= Ġ 6 ), ĊĠĠĠĠĠ ĠHelp ( dead End s Ġ= ĠarrayOf (" 8 8 8 8 "), Ġtarget Ġ= Ġ" 0 0 0 9 ", Ġoutput Ġ= Ġ 1 ), ĊĠĠĠĠĠ ĠHelp ( dead End s Ġ= ĠarrayOf (" 8 8 8 7 ", Ġ" 8 8 8 9 ", Ġ" 8 8 7 8 ", Ġ" 8 8 9 8 ", Ġ" 8 7 8 8 ", Ġ" 8 9 8 8 ", Ġ" 7 8 8 8 ", Ġ" 9 8 8 8 "), Ġtarget Ġ= Ġ" 8 8 8 8 ", Ġoutput Ġ= Ġ- 1 ) ĊĠ Ġ). map Indexed Ġ{ Ġindex , Ġitem Ġ-> ĊĠĠĠ Ġval Ġoutput Ġ= Ġopen The Lock . execute ( dead End s Ġ= Ġitem . dead End s , Ġgoal Ġ= Ġitem . target ) ĊĠĠĠ Ġif Ġ( output Ġ!= Ġitem . output ) Ġ{ ĊĠĠĠĠĠ Ġprintln (" error Ġwith Ġ$ item Ġwrong Ġoutput Ġ$ output ") ĊĠĠĠ Ġ} Ġelse Ġprintln (" done Ġwith Ġ$ index ") ĊĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠHelp ( val Ġdead End s : ĠArray < String >, Ġval Ġtarget : ĠString , Ġval Ġoutput : ĠInt )