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("")
}
}
以上就是本文给大家分享的代码的全部内容了,希望大家能够喜欢。