/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠN icol as ĠMal ta is Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ċ Ġ* Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ċ Ġ* Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ċ Ġ* Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ċ Ġ* Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ċ Ġ* Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ċ Ġ* Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ċ Ġ* Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ċ Ġ* Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , Ċ Ġ* ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES Ċ Ġ* ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . Ċ Ġ* ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR Ċ Ġ* ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , Ċ Ġ* ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . mal ta is n . ma ze gen . ma ze ĊĊ Ċ /** Ċ Ġ* ĠA Ġcell Ġfor Ġ[ Theta M aze ], Ġdifferent Ġthan Ġother Ġcells Ġbecause Ġit Ġcan Ċ Ġ* Ġsometimes Ġhave Ġmore Ġthan Ġone Ġneighbor Ġon Ġthe Ġout ward Ġside . Ċ Ġ* ĠHas Ġout ward , Ġin ward , Ġclock wise Ġand Ġcounter clock wise Ġsides . Ċ Ġ*/ Ċ class ĠThe ta Cell ( override Ġval Ġm aze : ĠThe ta M aze , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġposition : ĠPosition Pol ar ) Ġ: ĠCell ( ma ze , Ġposition ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġneighbors : ĠList < Cell > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Cell >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( side Ġin Ġall Side s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( side Ġ== ĠSide . OUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . addAll ( out ward Cells ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġget Cell On Side ( side ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cell Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( cell ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġout ward Cells : ĠList < Theta Cell > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġm aze . get Out ward Cells Of ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Cell On Side ( side : ĠCell . Side ): ĠThe ta Cell ? Ġ= Ġwhen Ġ( side ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSide . OUT Ġ-> Ġm aze . get Out ward Cell Of ( this ) ĊĠĠĠĠĠĠĠ ĠSide . IN Ġ-> Ġm aze . getIn ward Cell Of ( this ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġsuper . getCell On Side ( side ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cell Ġ!== Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Ġas ĠThe ta Cell ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCan Ġhappens Ġif Ġtrying Ġto Ġget Ġclock wise Ġneighbor Ġof Ġcenter Ġcell Ġfor Ġexample . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSuper Ġmethod Ġwill Ġtry Ġto Ġget Ġcell At ( Position Pol ar ( 1 , Ġ 0 )) Ġand Ġthe Ġcircular Ġwrapping ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġmake Ġit Ġreturn Ġthe Ġcenter Ġcell Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Accessible Neighbors (): ĠMutable List < Theta Cell > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Theta Cell >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( side Ġin Ġall Side s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( side Ġ== ĠSide . OUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġcan Ġbe Ġmany Ġcells Ġin Ġthis Ġdirection , Ġcheck Ġthem Ġall . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( neighbor Ġin Ġout ward Cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! neighbor . has Side ( Side . IN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( neighbor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! has Side ( side )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbor Ġ= Ġget Cell On Side ( side ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( neighbor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( neighbor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Side ( side : ĠCell . Side ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( side Ġ== ĠSide . OUT Ġ&& Ġout ward Cells . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOut ward Ġside Ġvalue Ġis Ġun reli able Ġif Ġnot Ġon Ġlast Ġrow , Ġmanually Ġcheck Ġeach Ġout ward Ġcell . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cell Ġin Ġout ward Cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cell . has Side ( Side . IN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOne Ġof Ġthe Ġout ward Ġcells Ġis Ġconnected Ġto Ġthis Ġcell , Ġdon 't Ġcount Ġas Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . has Side ( side ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Side Of Cell ( cell : ĠCell ): ĠCell . Side ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cell . ma ze Ġ=== Ġm aze ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( side Ġin Ġall Side s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( side Ġ== ĠSide . OUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġcan Ġbe Ġmany Ġcells Ġin Ġthis Ġdirection , Ġcheck Ġthem Ġall . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( out Cell Ġin Ġout ward Cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( out Cell Ġ== Ġcell ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSide . OUT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( getCell On Side ( side ) Ġ== Ġcell ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġside ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsides Count : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= ĠInteger . bit Count ( value Ġand ĠSide . OUT . value . inv ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Side ( Side . OUT )) Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġall Side s : ĠList < Side > Ġ= ĠSide . ALL ĊĊĠĠĠ Ġoverride Ġval Ġall Side s Value : ĠInt Ġ= ĠSide . ALL _ VALUE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnum Ġclass Ġfor Ġthe Ġside Ġa Ġtheta Ġcell . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠSide ( override Ġval Ġvalue : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġrelative Pos : ĠPosition Pol ar ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġsymbol : ĠString ) Ġ: ĠCell . Side Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġout ward Ġside Ġof Ġa Ġcell . ĠThis Ġside Ġhas Ġno Ġmeaning Ġif Ġthere 's Ġmore Ġthan ĊĠĠĠĠĠĠĠĠ Ġ* Ġone Ġcell Ġon Ġthe Ġside . Ġ[ IN ] Ġside Ġshould Ġbe Ġused Ġinstead . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠOUT ( 1 , Ġnull , Ġ" OUT "), ĊĠĠĠĠĠĠĠ ĠIN ( 2 , Ġnull , Ġ" IN "), ĊĠĠĠĠĠĠĠ ĠC W ( 4 , ĠPosition Pol ar (- 1 , Ġ 0 ), Ġ" CW "), ĊĠĠĠĠĠĠĠ ĠCC W ( 8 , ĠPosition Pol ar ( 1 , Ġ 0 ), Ġ" CC W "); ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġopposite : ĠCell . Side ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOUT Ġ-> ĠIN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIN Ġ-> ĠOUT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC W Ġ-> ĠCC W ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCC W Ġ-> ĠC W ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠALL Ġ= ĠlistOf ( OUT , ĠIN , ĠC W , ĠCC W ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠALL _ VALUE Ġ= Ġ 1 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ