package Ġcom . example . s udoku . game čĊč Ċ import Ġandroidx . lifecycle . Mutable LiveData čĊč Ċ class ĠS udoku Solver Ġ{ čĊĠĠĠ Ġvar Ġselected Cell LiveData Ġ= ĠMutable LiveData < Pair < Int , ĠInt >>() čĊĠĠĠ Ġvar Ġcells LiveData Ġ= ĠMutable LiveData < List < Cell >>() čĊĠĠĠ Ġvar Ġhighlighted Keys LiveData Ġ= ĠMutable LiveData < Set < Int >>() čĊčĊĠĠĠ Ġprivate Ġvar Ġselected Row Ġ= Ġ 4 čĊĠĠĠ Ġprivate Ġvar Ġselected Col Ġ= Ġ 4 čĊčĊĠĠĠ Ġprivate Ġval Ġboard : ĠBoard čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġcells Ġ= ĠList ( 9 Ġ* Ġ 9 ) Ġ{ Ġi Ġ-> ĠCell ( i Ġ/ Ġ 9 , Ġi Ġ% Ġ 9 , Ġ 0 )} čĊĠĠĠĠĠĠĠ Ġboard Ġ= ĠBoard ( 9 , Ġcells ) čĊčĊĠĠĠĠĠĠĠ Ġselected Cell LiveData . post Value ( Pair ( selected Row , Ġselected Col )) čĊĠĠĠĠĠĠĠ Ġcells LiveData . post Value ( board . cells ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġhandle Input ( number : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( selected Row Ġ== Ġ- 1 Ġ|| Ġselected Col Ġ== Ġ- 1 ) Ġreturn čĊĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġboard . getCell ( selected Row , Ġselected Col ) čĊĠĠĠĠĠĠĠ Ġif Ġ(! cell . isOpen ) Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġcell . value Ġ= Ġnumber čĊĠĠĠĠĠĠĠ Ġcells LiveData . post Value ( board . cells ) čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġfun Ġupdate Selected Cell ( row : ĠInt , Ġcol : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġboard . getCell ( selected Row , Ġselected Col ) čĊĠĠĠĠĠĠĠ Ġselected Row Ġ= Ġrow čĊĠĠĠĠĠĠĠ Ġselected Col Ġ= Ġcol čĊĠĠĠĠĠĠĠ Ġselected Cell LiveData . post Value ( Pair ( row , Ġcol )) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġdelete () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġboard . getCell ( selected Row , Ġselected Col ) čĊĠĠĠĠĠĠĠ Ġif Ġ(! cell . isOpen ) Ġreturn čĊĠĠĠĠĠĠĠ Ġcell . value Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġcells LiveData . post Value ( board . cells ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġdelete All () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 9 čĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . getCell ( i , Ġj ). value Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . getCell ( i , Ġj ). is S olved Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . getCell ( i , Ġj ). isOpen Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġcells LiveData . post Value ( board . cells ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġs udoku Solver Algorithm () Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 9 čĊĠĠĠĠĠĠĠ Ġval Ġsqrt Ġ= Ġ 3 čĊĠĠĠĠĠĠĠ Ġvar Ġs udoku Solve Board Ġ= ĠarrayOf < Array < Int >>() čĊčĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 8 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarray Ġ= ĠarrayOf < Int >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 .. 8 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Ġ+= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs udoku Solve Board Ġ+= Ġarray čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġboard . getCell ( i , Ġj ). value čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs udoku Solve Board [ i ][ j ] Ġ= Ġnum čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġis Safe ( row : ĠInt , Ġcol : ĠInt , Ġnum : ĠInt ): ĠBoolean Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġ 0 Ġuntil Ġsize ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġthat Ġnumber Ġis Ġin Ġrow , Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( s udoku Solve Board [ row ][ d ] Ġ== Ġnum ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġ 0 Ġuntil Ġsize ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġthat Ġnumber Ġis Ġin Ġcol , Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( s udoku Solve Board [ e ][ col ] Ġ== Ġnum ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// corre sponding Ġsquare čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox Row Start Ġ= Ġrow Ġ- Ġ( row Ġ% Ġsqrt ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox Col Start Ġ= Ġcol Ġ- Ġ( col Ġ% Ġsqrt ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( f Ġin Ġbox Row Start Ġuntil Ġ( box Row Start + sqrt )){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( g Ġin Ġbox Col Start Ġuntil Ġ( box Col Start + sqrt )){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( s udoku Solve Board [ f ][ g ] Ġ== Ġnum ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġno Ġfalse , Ġit 's Ġsafe čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġsolve S udoku ( array : ĠArray < Array < Int >>, Ġsize : ĠInt ): ĠBoolean Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrow Ġ= Ġ- 1 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcol Ġ= Ġ- 1 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠisEmpty Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s udoku Solve Board [ i ][ j ] Ġ== Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Ġ= Ġi čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol Ġ= Ġj čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġall Ġcells Ġfilled čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isEmpty ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġcells Ġfilled čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( num Ġin Ġ 1 Ġuntil Ġ 1 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Safe ( row , Ġcol , Ġnum )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs udoku Solve Board [ row ][ col ] Ġ= Ġnum čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( solve S udoku ( array , Ġsize )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs udoku Solve Board [ row ][ col ] Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( solve S udoku ( s udoku Solve Board , Ġsize )) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġs udoku Solve Board [ i ][ j ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( board . getCell ( i , Ġj ). value Ġ== Ġ 0 ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . getCell ( i , Ġj ). is S olved Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . getCell ( i , Ġj ). value Ġ= Ġnum čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . getCell ( i , Ġj ). isOpen Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġcells LiveData . post Value ( board . cells ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }