package Ġimage čĊč Ċ import Ġentity . Point č Ċ import Ġentity . Rectangle č Ċ import Ġkotlin . math . max č Ċ import Ġkotlin . math . min čĊč Ċ class ĠGrid B read th First Searcher Ġconstructor ( val Ġheight : ĠInt , Ġval Ġwidth : ĠInt ) Ġ{ čĊĠĠĠ Ġval ĠA VA IL ABLE _ NODE Ġ= Ġ 0 čĊĠĠĠ Ġval ĠNOT _ AVAILABLE _ NODE Ġ= Ġ 1 čĊčĊĠĠĠ Ġval Ġgrid Ġ= ĠArray ( height ) Ġ{ Array ( width ) Ġ{ AVAILABLE _ NODE } Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġvisited Flags Ġ= Ġ ĠArray ( height ) Ġ{ Array ( width ) Ġ{ false } Ġ} čĊčĊĠĠĠ Ġfun Ġmark Node As Not Available ( x : ĠInt , Ġy : Int Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġgrid [ y ][ x ] Ġ= ĠNOT _ AVAILABLE _ NODE čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġstart At ( x : ĠInt , Ġy : ĠInt ): ĠRectangle ? Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( visited Flags [ y ][ x ] Ġ|| Ġgrid [ y ][ x ] Ġ== ĠNOT _ AVAILABLE _ NODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġvisited Flags [ y ][ x ] Ġ= Ġtrue čĊĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= ĠArray Deque < Point >() čĊĠĠĠĠĠĠĠ Ġqueue . add ( Point ( x , Ġy )) čĊĠĠĠĠĠĠĠ Ġvar Ġmax X Ġ= Ġ- 1 čĊĠĠĠĠĠĠĠ Ġvar Ġmin X Ġ= Ġx čĊĠĠĠĠĠĠĠ Ġvar Ġmax Y Ġ= Ġ- 1 čĊĠĠĠĠĠĠĠ Ġvar Ġmin Y Ġ= Ġy čĊĠĠĠĠĠĠĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġqueue . remove First () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å·¦ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top . x Ġ- Ġ 1 Ġ> Ġ 0 Ġ&& Ġ! visited Flags [ top . y ][ top . x Ġ- Ġ 1 ] Ġ&& Ġgrid [ top . y ][ top . x Ġ- Ġ 1 ] Ġ== ĠA VA IL ABLE _ NODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( Point ( top . x Ġ- Ġ 1 , Ġtop . y )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Flags [ top . y ][ top . x Ġ- Ġ 1 ] Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin X Ġ= Ġmin ( min X , Ġtop . x Ġ- Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åı³ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top . x Ġ+ Ġ 1 Ġ< Ġwidth Ġ&& Ġ! visited Flags [ top . y ][ top . x Ġ+ Ġ 1 ] Ġ&& Ġgrid [ top . y ][ top . x Ġ+ Ġ 1 ] Ġ== ĠA VA IL ABLE _ NODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( Point ( top . x Ġ+ Ġ 1 , Ġtop . y )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Flags [ top . y ][ top . x Ġ+ Ġ 1 ] Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax X Ġ= Ġmax ( max X , Ġtop . x Ġ+ Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸Ĭ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top . y Ġ- Ġ 1 Ġ> Ġ 0 Ġ&& Ġ! visited Flags [ top . y Ġ- Ġ 1 ][ top . x ] Ġ&& Ġgrid [ top . y Ġ- Ġ 1 ][ top . x ] Ġ== ĠA VA IL ABLE _ NODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( Point ( top . x , Ġtop . y Ġ- Ġ 1 )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Flags [ top . y Ġ- Ġ 1 ][ top . x ] Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Y Ġ= Ġmin ( min Y , Ġtop . y Ġ- Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸ĭ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top . y Ġ+ Ġ 1 Ġ< Ġheight Ġ&& Ġ! visited Flags [ top . y Ġ+ Ġ 1 ][ top . x ] Ġ&& Ġgrid [ top . y Ġ+ Ġ 1 ][ top . x ] Ġ== ĠA VA IL ABLE _ NODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( Point ( top . x , Ġtop . y Ġ+ Ġ 1 )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Flags [ top . y Ġ+ Ġ 1 ][ top . x ] Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Y Ġ= Ġmax ( max Y , Ġtop . y Ġ+ Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn ĠRectangle ( Point ( min X , Ġmin Y ), ĠPoint ( max X , Ġmax Y )) čĊĠĠĠ Ġ} č Ċ }