go语言实现数独游戏

栏目: Go · 发布时间: 6年前

内容简介:[代码存放于我的github上] (https://github.com/Bin-DuS/jiuyinzhenjing/tree/master/0002_gosrc/gopl_learn/037_go_demo_example/)example.gosudoku/sudoku.go

[代码存放于我的github上] (https://github.com/Bin-DuS/jiuyinzhenjing/tree/master/0002_gosrc/gopl_learn/037_go_demo_example/)

example.go

``
package main
import (
	"./sudoku"
)

func main() {
	//var smap sudoku.Sudomap
	//smap = make([]byte,9)
	//for i:= 0; i<len(smap);i++{
	//	smap[i] = make (byte,9)
	//}
	smap := sudoku.Sudomap{
		{5, 3, 0, 0, 7, 0, 0, 0, 0},
		{6, 0, 0, 1, 9, 5, 0, 0, 0},
		{0, 9, 8, 0, 0, 0, 0, 6, 0},
		{8, 0, 0, 0, 6, 0, 0, 0, 3},
		{4, 0, 0, 8, 0, 3, 0, 0, 1},
		{7, 0, 0, 0, 2, 0, 0, 0, 6},
		{0, 6, 0, 0, 0, 0, 2, 8, 0},
		{0, 0, 0, 4, 1, 9, 0, 0, 5},
		{0, 0, 0, 0, 8, 0, 0, 7, 9},
	}
	smap.SolveSudoku()
}

sudoku/sudoku.go

``

package sudoku

import (
	"fmt"
)

type Sudomap [][]byte

var CanChoose []map[byte]byte // 0-8 行 9-17 列 18-26 块 可填值的map
var count = 0

func (smap *Sudomap) Print() {
	for _, line := range *smap {
		for _, v := range line {
			fmt.Printf("%d ", v)
		}
		fmt.Println()
	}
}
func PrintChoose() {
	i := 0
	for _, v := range CanChoose {
		fmt.Println(i, v)
		i++
	}
}

/*
	统计空缺的个数
*/
func (smap *Sudomap) countZero() {
	for _, line := range *smap {
		for _, v := range line {
			if v == 0 { // 值为0时表示可填
				count++
			}
		}
	}
}
func makemap() (m map[byte]byte) {
	var i byte
	m = make(map[byte]byte)
	for i = 1; i <= 9; i++ {
		m[i] = i
	}
	return
}

// 初始化可以填的数的列表,为map[int]int的数组
func (smap *Sudomap) initCanChoose() {
	// 数组初始化时是27个map 每个map中的键值为1-9
	for i := 0; i < 27; i++ {
		CanChoose = append(CanChoose, makemap())
	}
	// 根据传进来的数独数据进行删除可以填写的map表
	for i := 0; i < 9; i++ {
		for j := 0; j < 9; j++ {
			if c := (*smap)[i][j]; c != 0 {
				//fmt.Println(c,i,j)
				delete(CanChoose[i], c)            // 第i行
				delete(CanChoose[j+9], c)          // 第j列
				delete(CanChoose[j/3+i/3*3+18], c) // 第?块
				//PrintChoose()
			}
		}
	}
}

/*
	判断是否可以填写,根据行,列,块map确定唯一可以填写的值
*/
func (smap *Sudomap) isCanChoose(i, j int) (byte, bool) {
	flag := 0
	var p byte
	var ok bool
	for _, v := range CanChoose[i] {
		p, ok = CanChoose[j+9][v]
		if ok != true {
			continue
		}
		p, ok = CanChoose[j/3+i/3*3+18][v]
		if ok != true {
			continue
		}
		flag++
	}
	if flag == 1 {
		//fmt.Println("isCanChoose ",p)
		return p, true
	} else {
		return p, false
	}
}

/*
进行填值操作
*/
func (smap *Sudomap) do() {
	for i := 0; i < 9; i++ {
		for j := 0; j < 9; j++ {
			if c := (*smap)[i][j]; c == 0 {
				v, ok := smap.isCanChoose(i, j)
				if ok != true || v == 0 {
					continue
				}
				count--
				delete(CanChoose[i], v)            // 第i行
				delete(CanChoose[j+9], v)          // 第j列
				delete(CanChoose[j/3+i/3*3+18], v) // 第?块
				(*smap)[i][j] = v
				fmt.Println("我认为:(", i+1, "行", j+1, "列)为", v)
			}
		}
	}
}

/*
	主入口
*/
func (smap *Sudomap) SolveSudoku() {
	smap.countZero()
	//fmt.Println(count)
	//smap.Print()
	smap.initCanChoose()
	//PrintChoose()
	for count > 0 {
		smap.do()
	}
	//smap.Print()
}

以上所述就是小编给大家介绍的《go语言实现数独游戏》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Smarter Than You Think

Smarter Than You Think

Clive Thompson / Penguin Press HC, The / 2013-9-12 / USD 27.95

It's undeniable—technology is changing the way we think. But is it for the better? Amid a chorus of doomsayers, Clive Thompson delivers a resounding "yes." The Internet age has produced a radical new ......一起来看看 《Smarter Than You Think》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具