package Ġru . tim ak den . ches sp uzzle Ċ Ċ data Ġclass ĠChe ss P uzzle ( ĊĠĠĠ Ġval Ġrows : ĠInt , ĊĠĠĠ Ġval Ġcolumns : ĠInt , ĊĠĠĠ Ġval Ġk ings : ĠInt , ĊĠĠĠ Ġval Ġque ens : ĠInt , ĊĠĠĠ Ġval Ġro ok s : ĠInt , ĊĠĠĠ Ġval Ġb ish ops : ĠInt , ĊĠĠĠ Ġval Ġkn ights : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġvar ĠnumberOf Unique Solutions Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġval Ġboard : ĠChe ss Board ĊĊĠĠĠ Ġprivate Ġval Ġlast Pl aced Pieces Ġ= Ġmutable Map Of < String , ĠChe ss Piece ?> () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremaining Che ss Pieces Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġrepeat ( k ings ) Ġ{ Ġremaining Che ss Pieces Ġ+= ĠK ING Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( que ens ) Ġ{ Ġremaining Che ss Pieces Ġ+= ĠQ UE EN Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( ro ok s ) Ġ{ Ġremaining Che ss Pieces Ġ+= ĠRO OK Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( b ish ops ) Ġ{ Ġremaining Che ss Pieces Ġ+= ĠB ISH OP Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( kn ights ) Ġ{ Ġremaining Che ss Pieces Ġ+= ĠK N IGHT Ġ} ĊĊĠĠĠĠĠĠĠ Ġboard Ġ= ĠChe ss Board ( rows , Ġcolumns , ĠArray Deque ( remaining Che ss Pieces )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTake Ġfirst Ġavailable Ġpiece ĊĠĠĠĠĠĠĠ Ġval Ġpiece Type Ġ= Ġboard . remaining Pieces . remove First () ĊĊĠĠĠĠĠĠĠ Ġvar Ġr Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġlast Ġplaced Ġpiece Ġof Ġthat Ġtype ĊĠĠĠĠĠĠĠ Ġlast Pl aced Pieces [ piece Type ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġduplicated Ġsolutions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ= Ġit . row ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġit . column Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġr Ġuntil Ġboard . rows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġc Ġuntil Ġboard . columns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġcell Ġis Ġoccupied Ġthen Ġskip Ġcurrent Ġiteration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! board . is Cell Free ( row , Ġcolumn )) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpiece To Place Ġ= ĠChe ss Piece Factory . get Piece ( piece Type , Ġrow , Ġcolumn ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġpiece Ġcan 't Ġbe Ġsafely Ġplaced Ġthen Ġskip Ġcurrent Ġiteration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! piece To Place . is Safe ( board )) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġpiece Ġto Ġboard ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . placed Pieces . add ( 0 , Ġpiece To Place ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Pl aced Pieces [ piece To Place . toString ()] Ġ= Ġpiece To Place ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( board . remaining Pieces . isEmpty ()) ĠnumberOf Unique Solutions ++ Ġelse Ġsolve () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġlast Ġplaced Ġpiece ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . placed Pieces . remove ( piece To Place ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġpiece Ġto Ġboard ĊĠĠĠĠĠĠĠ Ġboard . remaining Pieces . add First ( piece Type ) ĊĠĠĠĠĠĠĠ Ġlast Pl aced Pieces [ piece Type ] Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ