package Ġj udoku Ċ Ċ internal Ġclass ĠOptions Cache ( initial : ĠGrid ) Ġ{ ĊĠĠĠ Ġ/* Ġ Ġwe Ġdeli ber ately Ġdon 't Ġstore Ġthe Ġgrid Ġto Ġwhich Ġthis Ġcache Ġinitially Ġreferred . ĠIt Ġwould ĊĠĠĠĠĠĠĠ Ġimmediately Ġget Ġout Ġof Ġdate Ġand Ġthis Ġisn 't Ġthe Ġplace Ġto Ġkeep Ġit Ġupdated . ĠInstead , Ġusers ĊĠĠĠĠĠĠĠ Ġof Ġthis Ġclass Ġneed Ġto Ġtrack Ġthe Ġchanging Ġgrid Ġto Ġwhich Ġthis Ġcache Ġcorresponds . ĠThere 's Ġa ĊĠĠĠĠĠĠĠ Ġgrid Ġheld Ġhere Ġbut Ġit 's Ġan Ġempty Ġcopy Ġof Ġthe Ġone Ġused Ġto Ġinitialise Ġthe Ġcache Ġso Ġthat Ġit ĊĠĠĠĠĠĠĠ Ġcan Ġbe Ġused Ġto Ġdo Ġdimension Ġconversions Ġbetween Ġcolumns , Ġrows , Ġcell - n , Ġboxes , Ġbands , ĊĠĠĠĠĠĠĠ Ġstacks , Ġetc . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġconv Ġ= ĠGrid ( initial . box Width , Ġinitial . box Height ) ĊĊĠĠĠ Ġprivate Ġval Ġrows : ĠInt Array ĊĠĠĠ Ġprivate Ġval Ġcolumns : ĠInt Array ĊĠĠĠ Ġprivate Ġval Ġboxes : ĠInt Array ĊĠĠĠ Ġprivate Ġval Ġempty : ĠBoolean Array ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġyou Ġcould Ġup size Ġthe Ġmasks Ġfrom ĠInt Ġto ĠLong Ġif Ġyou Ġneeded Ġlarger Ġgrids ĊĠĠĠĠĠĠĠ Ġcheck ( initial . size Ġ< ĠInteger . SIZE ) ĊĊĠĠĠĠĠĠĠ Ġempty Ġ= ĠBoolean Array ( 1 Ġ+ Ġconv . num Cells , Ġ{ Ġif Ġ( it Ġ== Ġ 0 ) Ġfalse Ġelse Ġinitial . isEmpty ( it ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ Ġthese Ġare Ġmasks Ġof Ġwhich Ġvalues Ġare Ġallowed Ġ( i . e ., Ġthose Ġthat Ġdon 't Ġappear Ġalready ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġthe Ġpeer Ġcells Ġof Ġthe Ġcolumn , Ġrow Ġand Ġbox . Ġ*/ ĊĠĠĠĠĠĠĠ Ġcolumns Ġ= ĠInt Array ( 1 Ġ+ Ġconv . num Columns , Ġ{ Ġif Ġ( it Ġ== Ġ 0 ) Ġ- 1 Ġelse Ġcolumn Mask ( initial , Ġit ) Ġ}) ĊĠĠĠĠĠĠĠ Ġrows Ġ= ĠInt Array ( 1 Ġ+ Ġconv . num Rows , Ġ{ Ġif Ġ( it Ġ== Ġ 0 ) Ġ- 1 Ġelse Ġrow Mask ( initial , Ġit ) Ġ}) ĊĠĠĠĠĠĠĠ Ġboxes Ġ= ĠInt Array ( 1 Ġ+ Ġconv . num Boxes , Ġ{ Ġif Ġ( it Ġ== Ġ 0 ) Ġ- 1 Ġelse Ġbox Mask ( initial , Ġit ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCell ( val Ġn : ĠInt , Ġval Ġmask : ĠInt , Ġval Ġpop count : ĠInt ) ĊĊĠĠĠ Ġfun Ġfew est Options (): ĠCell ? Ġ= Ġwith Ġ( conv ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbest : ĠCell ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠValues Ġare Ġstored Ġinternally Ġin Ġthe ĠGrid Ġclass Ġin Ġrow - major Ġorder , Ġso Ġiterate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns Ġwithin Ġrows Ġ*/ ĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 1 .. num Rows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rows [ row ] Ġ== Ġ 0 ) Ġ{ Ġn Ġ+= Ġnum Columns ; Ġcontinue Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 1 .. num Columns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! empty [++ n ]) Ġcontinue ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġband Ġ= Ġto Band From Row ( row ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġto Stack From Column ( col ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox Ġ= Ġto Box From Stack Band ( stack , Ġband ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmask Ġ= Ġrows [ row ] Ġand Ġcolumns [ col ] Ġand Ġboxes [ box ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop count Ġ= ĠInteger . bit Count ( mask ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop count Ġ== Ġ 0 Ġ-> Ġreturn ĠCell ( n , Ġmask , Ġpop count ) ĠĠ Ġ// Ġun successful Ġleaf Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop count Ġ== Ġ 1 Ġ-> Ġreturn ĠCell ( n , Ġmask , Ġpop count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Ġ== Ġnull Ġ-> Ġbest Ġ= ĠCell ( n , Ġmask , Ġpop count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop count Ġ< Ġbest . pop count Ġ-> Ġbest Ġ= ĠCell ( n , Ġmask , Ġpop count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( n : ĠInt , Ġold : ĠInt , Ġnew : ĠInt ) Ġ= Ġwith Ġ( conv ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( old Ġ== Ġnew ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġassert ( empty [ n ] Ġ== Ġ( old Ġ== ĠGrid . EMPTY )) ĊĠĠĠĠĠĠĠ Ġempty [ n ] Ġ= Ġnew Ġ== ĠGrid . EMPTY ĊĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġto Row ( n ) ĊĠĠĠĠĠĠĠ Ġval Ġcol Ġ= Ġto Column ( n ) ĊĠĠĠĠĠĠĠ Ġval Ġbox Ġ= Ġto Box From Stack Band ( to Stack From Column ( col ), Ġto Band From Row ( row )) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠWARNING Ġ- Ġusers Ġof Ġthis Ġclass Ġmust Ġensure Ġthat Ġthe Ġgrid Ġhas Ġno Ġdup Ġvalues Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( old Ġ!= ĠGrid . EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ 1 Ġshl Ġold ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthe Ġold Ġvalue Ġwas Ġpreviously Ġreset ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (( columns [ col ] Ġand Ġvalue ) Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (( rows [ row ] Ġand Ġvalue ) Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (( boxes [ box ] Ġand Ġvalue ) Ġ== Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... and Ġnow Ġset Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ col ] Ġ= Ġcolumns [ col ] Ġor Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ row ] Ġ= Ġrows [ row ] Ġor Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboxes [ box ] Ġ= Ġboxes [ box ] Ġor Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( new Ġ!= ĠGrid . EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ 1 Ġshl Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinv Ġ= Ġvalue . inv () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthe Ġnew Ġvalue Ġwas Ġpreviously Ġset ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (( columns [ col ] Ġand Ġvalue ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (( rows [ row ] Ġand Ġvalue ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (( boxes [ box ] Ġand Ġvalue ) Ġ!= Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... and Ġnow Ġreset Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ col ] Ġ= Ġcolumns [ col ] Ġand Ġinv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ row ] Ġ= Ġrows [ row ] Ġand Ġinv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboxes [ box ] Ġ= Ġboxes [ box ] Ġand Ġinv ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfew est Options Un cached ( g : ĠGrid ): ĠCell ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠWARNING Ġ- Ġthis Ġis Ġthe Ġun cached Ġequivalent Ġto Ġfew est Options (). ĠIts Ġadvantage Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthat Ġyou Ġdon 't Ġneed Ġto Ġhave Ġmaintained Ġthe Ġcache Ġup - to - date ; Ġyou Ġcan Ġjust Ġgive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġa ĠGrid Ġand Ġget Ġan Ġanswer . ĠIt 's Ġmuch Ġslower Ġthough , Ġabout Ġ 2 . 5 x Ġ*/ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbest : ĠCell ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 1 .. g . num Rows ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 1 .. g . num Columns ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . isEmpty ( ++ n )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmask Ġ= Ġg ._ getOptions Mask ( col , Ġrow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop count Ġ= ĠInteger . bit Count ( mask ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop count Ġ== Ġ 0 Ġ-> Ġreturn ĠCell ( n , Ġmask , Ġpop count ) ĠĠ Ġ// Ġun successful Ġleaf Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop count Ġ== Ġ 1 Ġ-> Ġreturn ĠCell ( n , Ġmask , Ġpop count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Ġ== Ġnull Ġ-> Ġbest Ġ= ĠCell ( n , Ġmask , Ġpop count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop count Ġ< Ġbest . pop count Ġ-> Ġbest Ġ= ĠCell ( n , Ġmask , Ġpop count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbest ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrow Mask ( initial : ĠGrid , Ġrow : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġinitial . ME GA _ MASK ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( initial ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġto N th ( 1 , Ġrow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Ġ( num Columns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget Cell ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask Ġand Ġ( 1 Ġshl Ġvalue ). inv () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmask ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcolumn Mask ( initial : ĠGrid , Ġcol : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġinitial . ME GA _ MASK ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( initial ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġto N th ( col , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Ġ( num Rows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget Cell ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ+= Ġnum Columns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask Ġand Ġ( 1 Ġshl Ġvalue ). inv () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmask ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbox Mask ( initial : ĠGrid , Ġbox : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġinitial . ME GA _ MASK ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( initial ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġto Stack From Box ( box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġband Ġ= Ġto Band From Box ( box ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġto Left Column From Stack ( stack ) .. to Right Column From Stack ( stack )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġto Top Row From Band ( band ) .. to Bottom Row From Band ( band )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget Cell ( to N th ( col , Ġrow )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask Ġand Ġ( 1 Ġshl Ġvalue ). inv () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmask ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ