Go語(yǔ)言實(shí)現(xiàn)的最簡(jiǎn)單數(shù)獨(dú)解法
更新時(shí)間:2015年03月20日 11:03:24 投稿:hebedich
前面給大家介紹過(guò)使用javascript實(shí)現(xiàn)的簡(jiǎn)單的數(shù)獨(dú)解法,小伙伴們都非常喜歡,今天我們?cè)賮?lái)分享一則go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單的數(shù)獨(dú)解法,有需要的小伙伴來(lái)參考下。
soduku.go
復(fù)制代碼 代碼如下:
package main
import (
"fmt"
)
type node []int
var sudokuMay [9][9]node
var Sudoku = [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}}
func main() {
n := inited(Sudoku)
SudokuSure, _ := sure(sudokuMay)
for n > 0 {
n = Subinit(SudokuSure)
// Output(sudokuMay)
// fmt.Println(n)
SudokuSure, _ = sure(sudokuMay)
}
Output(sudokuMay)
fmt.Println(isEnable(sudokuMay))
// test()
}
func isEnable(tn [9][9]node) bool {
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if len(tn[i][j]) == 0 {
return false
}
}
}
return true
}
func sure(may [9][9]node) (sure [9][9]int, n int) {
n = 0
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if len(may[i][j]) == 1 {
sure[i][j] = may[i][j][0]
n++
} else {
sure[i][j] = 0
}
}
}
return
}
func test() {
i, j := 1, 3
fmt.Println(Sudoku[i][j])
for k := ((i / 3) * 3); k < ((i/3)*3)+3; k++ {
for l := ((j / 3) * 3); l < ((j/3)*3)+3; l++ {
fmt.Print(Sudoku[k][l])
}
fmt.Println(" ")
}
}
func inited(Sud [9][9]int) (changeCount int) {
tmp := 0
changeCount = 0
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if Sud[i][j] != 0 {
sudokuMay[i][j] = append(sudokuMay[i][j], Sud[i][j])
} else {
for k := 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
}
func Subinit(Sud [9][9]int) (changeCount int) {
tmp := 0
changeCount = 0
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if Sud[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
}
func excludeMay(ti, tj int, t node, S [9][9]int) (rmay node, changeCount int) {
changeCount = 0
var tmpChangeCount int
for i := 0; i < 9; i++ {
if S[i][tj] != 0 {
t, tmpChangeCount = exclude(t, S[i][tj])
changeCount += tmpChangeCount
}
if S[ti][i] != 0 {
t, tmpChangeCount = exclude(t, S[ti][i])
changeCount += tmpChangeCount
}
}
for k := ((ti / 3) * 3); k < ((ti/3)*3)+3; k++ {
for l := ((tj / 3) * 3); l < ((tj/3)*3)+3; l++ {
if S[k][l] != 0 {
t, tmpChangeCount = exclude(t, S[k][l])
changeCount += tmpChangeCount
}
}
}
rmay = t
return
}
func excludeFirstOne(smay node, n int) (rmay node, changeCount int) {
changeCount = 0
rmay = smay
for i := 0; i < len(smay); i++ {
if smay[i] == n {
changeCount++
rmay = append(smay[:i], smay[i+1:]...)
return
}
if i == len(smay)-1 {
return
}
}
return
}
func exclude(smay node, n int) (tmp node, changeCount int) {
var nc int
changeCount = 0
tmp, nc = excludeFirstOne(smay, n)
for nc > 0 {
tmp, nc = excludeFirstOne(tmp, n)
changeCount++
}
return
}
func Output(sudoku [9][9]node) {
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
fmt.Print(sudokuMay[i][j])
}
fmt.Println("")
}
}
以上就是本文給大家分享的代碼的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Golang內(nèi)存泄露場(chǎng)景與定位方式的實(shí)現(xiàn)
Golang有自動(dòng)垃圾回收機(jī)制,但是仍然可能會(huì)出現(xiàn)內(nèi)存泄漏的情況,本文主要介紹了Golang內(nèi)存泄露場(chǎng)景與定位方式的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的Web框架
Go語(yǔ)言(又稱Golang)因其高效的性能和簡(jiǎn)潔的語(yǔ)法,在編寫Web框架方面表現(xiàn)出色,下面將詳細(xì)介紹如何使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的Web框架,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下2024-05-05
Go語(yǔ)言學(xué)習(xí)之運(yùn)算符使用詳解
這篇文章主要介紹了Go語(yǔ)言中常用運(yùn)算符的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
golang 獲取當(dāng)前執(zhí)行程序路徑的操作
這篇文章主要介紹了golang 獲取當(dāng)前程序執(zhí)行路徑的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand的常用函數(shù)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand中的常用函數(shù),文中的示例代碼講解詳細(xì), 對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的小伙伴可以了解一下2022-12-12
Go語(yǔ)言學(xué)習(xí)之WaitGroup用法詳解
Go語(yǔ)言中的?WaitGroup?和?Java?中的?CyclicBarrier、CountDownLatch?非常類似。本文將詳細(xì)為大家講講WaitGroup的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06
Go語(yǔ)言for-range函數(shù)使用技巧實(shí)例探究
這篇文章主要為大家介紹了Go語(yǔ)言for-range函數(shù)使用技巧實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

