package Ġcom . ar man . jen ny . gen . c ave Ċ Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠCo en Ġon Ġ 2 2 - 4 - 2 0 1 9 . Ċ Ġ*/ Ċ object ĠC ave Gen Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠF LO OR _ LIMIT Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġconst Ġval ĠW ALL _ LIMIT Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġconst Ġval ĠT RE AS URE _ SE CRE CY Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġconst Ġval ĠT RE AS URE _ PROB ABILITY Ġ= Ġ 0 . 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠEN TR ANCE _ PROB ABILITY Ġ= Ġ 0 . 2 ĊĠĠĠ Ġprivate Ġconst Ġval ĠW ALL _ PROB ABILITY Ġ= Ġ 0 . 3 7 ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠW ALL Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠF LO OR Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠT RE AS URE Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġconst Ġval ĠEN TR ANCE Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġconst Ġval ĠST AIR S Ġ= Ġ 4 ĊĊĠĠĠ Ġprivate Ġvar Ġrandom : ĠRandom Ġ= ĠRandom () ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize ( data : ĠArray < IntArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġdata . size ĊĠĠĠĠĠĠĠ Ġval Ġcols Ġ= Ġdata [ 0 ]. size ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġcols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ x ][ y ] Ġ= Ġif Ġ( Math . random () Ġ< ĠW ALL _ PROB ABILITY ) ĠW ALL Ġelse ĠF LO OR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġcols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ rows Ġ- Ġ 1 ][ y ] Ġ= ĠW ALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 0 ][ y ] Ġ= ĠW ALL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ x ][ cols Ġ- Ġ 1 ] Ġ= ĠW ALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ x ][ 0 ] Ġ= ĠW ALL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġiterate ( data : ĠArray < IntArray >): ĠArray < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġdata . size ĊĠĠĠĠĠĠĠ Ġval Ġcols Ġ= Ġdata [ 0 ]. size ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 Ġuntil Ġrows Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 1 Ġuntil Ġcols Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcount Ne ighbours ( data , Ġx , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ x ][ y ] Ġ== ĠW ALL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ< ĠF LO OR _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewData [ x ][ y ] Ġ= ĠF LO OR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewData [ x ][ y ] Ġ= ĠW ALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> ĠW ALL _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewData [ x ][ y ] Ġ= ĠW ALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewData [ x ][ y ] Ġ= ĠF LO OR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠnewData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Ne ighbours ( data : ĠArray < IntArray >, Ġx : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġdata . size ĊĠĠĠĠĠĠĠ Ġval Ġcols Ġ= Ġdata [ 0 ]. size ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ- 1 .. 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 Ġ&& Ġj Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbour X Ġ= Ġx Ġ+ Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbour Y Ġ= Ġy Ġ+ Ġj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ne ighbour X Ġ< Ġ 0 Ġ|| Ġneighbour Y Ġ< Ġ 0 Ġ|| Ġneighbour X Ġ>= Ġrows Ġ|| Ġneighbour Y Ġ>= Ġcols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( data [ ne ighbour X ][ ne ighbour Y ] Ġ== ĠW ALL Ġ|| Ġdata [ ne ighbour X ][ ne ighbour Y ] Ġ== ĠEN TR ANCE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Entr ances ( data : ĠArray < IntArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġdata . size ĊĠĠĠĠĠĠĠ Ġval Ġcols Ġ= Ġdata [ 0 ]. size ĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġcols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġmost Ġleft Ġcolumn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ 1 ][ y ] Ġ== ĠF LO OR Ġ&& ĠMath . random () Ġ< ĠEN TR ANCE _ PROB ABILITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 0 ][ y ] Ġ= ĠEN TR ANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġmost Ġright Ġcolumn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ rows Ġ- Ġ 2 ][ y ] Ġ== ĠF LO OR Ġ&& ĠMath . random () Ġ< ĠEN TR ANCE _ PROB ABILITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ rows Ġ- Ġ 1 ][ y ] Ġ= ĠEN TR ANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġupper Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ x ][ 1 ] Ġ== ĠF LO OR Ġ&& ĠMath . random () Ġ< ĠEN TR ANCE _ PROB ABILITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ x ][ 0 ] Ġ= ĠEN TR ANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġlower Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ x ][ cols Ġ- Ġ 2 ] Ġ== ĠF LO OR Ġ&& ĠMath . random () Ġ< ĠEN TR ANCE _ PROB ABILITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ x ][ cols Ġ- Ġ 1 ] Ġ= ĠEN TR ANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd St airs ( data : ĠArray < IntArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġrandom . nextInt ( data . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġrandom . nextInt ( data [ i ]. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( j Ġ< Ġdata [ i ]. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ i ][ j ] Ġ== ĠF LO OR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ][ j ] Ġ= ĠST AIR S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Tre as ures ( data : ĠArray < IntArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 Ġuntil Ġdata . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 1 Ġuntil Ġdata [ x ]. size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ x ][ y ] Ġ== ĠF LO OR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ne ighbours ( data , Ġx , Ġy ) Ġ>= ĠT RE AS URE _ SE CRE CY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . random () Ġ< ĠT RE AS URE _ PROB ABILITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ x ][ y ] Ġ= ĠT RE AS URE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate ( rows : ĠInt , Ġcols : ĠInt , Ġiterations : ĠInt ): ĠArray < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠArray ( rows ) Ġ{ ĠInt Array ( cols ) Ġ} ĊĠĠĠĠĠĠĠ Ġinitialize ( data ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġiterations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterate ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate With St airs ( rows : ĠInt , Ġcols : ĠInt , Ġiterations : ĠInt ): ĠArray < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġgenerate ( rows , Ġcols , Ġiterations ) ĊĠĠĠĠĠĠĠ Ġadd St airs ( data ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate With Entr ances ( rows : ĠInt , Ġcols : ĠInt , Ġiterations : ĠInt ): ĠArray < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġgenerate ( rows , Ġcols , Ġiterations ) ĊĠĠĠĠĠĠĠ Ġadd Entr ances ( data ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate With Tre as ures ( rows : ĠInt , Ġcols : ĠInt , Ġiterations : ĠInt ): ĠArray < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġgenerate ( rows , Ġcols , Ġiterations ) ĊĠĠĠĠĠĠĠ Ġplace Tre as ures ( data ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate With Entr ances And Tre as ures ( rows : ĠInt , Ġcols : ĠInt , Ġiterations : ĠInt ): ĠArray < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġgenerate ( rows , Ġcols , Ġiterations ) ĊĠĠĠĠĠĠĠ Ġplace Tre as ures ( data ) ĊĠĠĠĠĠĠĠ Ġadd Entr ances ( data ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} Ċ Ċ }