Go语言实现的最简单数独解法
soduku.go
packagemain import( "fmt" ) typenode[]int varsudokuMay[9][9]node varSudoku=[9][9]int{ {0,0,0,0,0,0,8,0,0}, {0,8,2,4,0,0,0,0,0}, {1,9,0,0,6,3,0,0,0}, {0,5,0,0,8,0,7,0,0}, {6,7,8,2,0,9,1,4,3}, {0,0,3,0,4,0,0,8,0}, {0,0,0,6,2,0,0,9,4}, {0,0,0,0,0,5,6,1,0}, {0,0,0,6,0,0,0,0,0}} funcmain(){ n:=inited(Sudoku) SudokuSure,_:=sure(sudokuMay) forn>0{ n=Subinit(SudokuSure) //Output(sudokuMay) //fmt.Println(n) SudokuSure,_=sure(sudokuMay) } Output(sudokuMay) fmt.Println(isEnable(sudokuMay)) //test() } funcisEnable(tn[9][9]node)bool{ fori:=0;i<9;i++{ forj:=0;j<9;j++{ iflen(tn[i][j])==0{ returnfalse } } } returntrue } funcsure(may[9][9]node)(sure[9][9]int,nint){ n=0 fori:=0;i<9;i++{ forj:=0;j<9;j++{ iflen(may[i][j])==1{ sure[i][j]=may[i][j][0] n++ }else{ sure[i][j]=0 } } } return } functest(){ i,j:=1,3 fmt.Println(Sudoku[i][j]) fork:=((i/3)*3);k<((i/3)*3)+3;k++{ forl:=((j/3)*3);l<((j/3)*3)+3;l++{ fmt.Print(Sudoku[k][l]) } fmt.Println("") } } funcinited(Sud[9][9]int)(changeCountint){ tmp:=0 changeCount=0 fori:=0;i<9;i++{ forj:=0;j<9;j++{ ifSud[i][j]!=0{ sudokuMay[i][j]=append(sudokuMay[i][j],Sud[i][j]) }else{ fork:=0;k<9;k++{ sudokuMay[i][j]=append(sudokuMay[i][j],k+1) } sudokuMay[i][j],tmp=excludeMay(i,j,sudokuMay[i][j],Sud) changeCount+=tmp } } } return } funcSubinit(Sud[9][9]int)(changeCountint){ tmp:=0 changeCount=0 fori:=0;i<9;i++{ forj:=0;j<9;j++{ ifSud[i][j]!=0{ sudokuMay[i][j][0]=Sud[i][j] }else{ sudokuMay[i][j],tmp=excludeMay(i,j,sudokuMay[i][j],Sud) changeCount+=tmp } } } return } funcexcludeMay(ti,tjint,tnode,S[9][9]int)(rmaynode,changeCountint){ changeCount=0 vartmpChangeCountint fori:=0;i<9;i++{ ifS[i][tj]!=0{ t,tmpChangeCount=exclude(t,S[i][tj]) changeCount+=tmpChangeCount } ifS[ti][i]!=0{ t,tmpChangeCount=exclude(t,S[ti][i]) changeCount+=tmpChangeCount } } fork:=((ti/3)*3);k<((ti/3)*3)+3;k++{ forl:=((tj/3)*3);l<((tj/3)*3)+3;l++{ ifS[k][l]!=0{ t,tmpChangeCount=exclude(t,S[k][l]) changeCount+=tmpChangeCount } } } rmay=t return } funcexcludeFirstOne(smaynode,nint)(rmaynode,changeCountint){ changeCount=0 rmay=smay fori:=0;i<len(smay);i++{ ifsmay[i]==n{ changeCount++ rmay=append(smay[:i],smay[i+1:]...) return } ifi==len(smay)-1{ return } } return } funcexclude(smaynode,nint)(tmpnode,changeCountint){ varncint changeCount=0 tmp,nc=excludeFirstOne(smay,n) fornc>0{ tmp,nc=excludeFirstOne(tmp,n) changeCount++ } return } funcOutput(sudoku[9][9]node){ fori:=0;i<9;i++{ forj:=0;j<9;j++{ fmt.Print(sudokuMay[i][j]) } fmt.Println("") } }
以上就是本文给大家分享的代码的全部内容了,希望大家能够喜欢。