例子托管于github

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
func (smap *Sudomap) Print() {
    for _, line := range *smap {
        for _, v := range line {
            fmt.Printf("%d ", v)
        }
        fmt.Println()
    }
}
func PrintChoose() {
    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) {
    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例子(二) 使用go语言实现数独游戏的更多相关文章

  1. C语言学习 数独游戏

    摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. C语言学习 数独游戏 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 ...

  2. GJM :用JIRA管理你的项目(二)JIRA语言包支持及插件支持 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  3. 红黑树(二)之 C语言的实现

    概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现 ...

  4. 预备作业二——有关CCCCC语言(・᷄ᵌ・᷅)

    有关CCCCC语言(・᷄ᵌ・᷅) 下面又到了回答老师问题的时候啦-(・᷄ᵌ・᷅) 有些问题正在深思熟虑中!敬请期待近期的不间断更新! 你有什么技能比大多人(超过90%以上)更好? 针对这个技能的获取你 ...

  5. 经典数独游戏+数独求解器—纯C语言实现

    "心常乐数独小游戏"(下面简称"本软件")是一款windows平台下的数独游戏软件. 本软件是开源.免费软件. 本软件使用纯C语言编写,MinGW编译,NSIS ...

  6. 用 JS 做一个数独游戏(二)

    用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...

  7. Swift数独游戏优化——C++与OC混编、plist自动生成

    一.为什么要C++与OC混编? 在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的.   但是在我的例子中我发现这样存在一定的局限性: 1.我是利用Termin ...

  8. 150+行Python代码实现带界面的数独游戏

    150行代码实现图形化数独游戏 Github地址,欢迎各位大佬们fork.star啥的,感谢: 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独 ...

  9. 用html5 canvas和JS写个数独游戏

    为啥要写这个游戏? 因为我儿子二年级数字下册最后一章讲到了数独.他想玩儿. 因为我也想玩有提示功能的数独. 因为我也正想决定要把HTML5和JS搞搞熟.熟悉一个编程平台,最好的办法,就是了解其原理与思 ...

随机推荐

  1. OpenCV 图像平滑处理

    #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" us ...

  2. python3下应用requests

    模拟浏览器请求有两种,一种是不需要用户登录或者验证的请求,一种是需要用户登录或者验证的请求 那么我们先来说说不需要用户登录的方法 这种方式直接可以获取源码,用get的请求方式 登录的方式 获取这种页面 ...

  3. 第一次提交本地代码到github上

    上传本地项目到github: 一.SSH方式 配置ssh 进入你要上传项目中的文件夹 1)先配置ssh,输入 ssh-keygen -t rsa -C "your_email@example ...

  4. babel-loader的原理

    本文转载自默语的博客. Babel包的构成 核心包 babel-core:是babel转译器本身,提供转译的API,例如babel.transform等,webpack的babel-loader就是调 ...

  5. 微软Project Oxford帮助开发人员创建更智能的应用

    Oxford帮助开发人员创建更智能的应用" title="微软Project Oxford帮助开发人员创建更智能的应用"> 假设你是一名对关于健身的应用充满奇思妙想 ...

  6. 2.mac下 安装go-ethereum

    Contents 上代码 A.前期准备:http://m.2cto.com/kf/201612/573010.html (1)安装python2.7,mac在终端中直接使用以下命令:brew inst ...

  7. Hexo next主题安装algolia

    一直在使用hexo写自己的博客,最近博客刚刚搬家重新搞了下博客: 1.为hexo添加站内搜索 我用的是algolia,在next主题5.x以上的版本集成了algolia站内搜索功能,我们只需要简单的配 ...

  8. CALL/APPLY、一些编程基础以及一些基础知识、正则

    call.apply.bind 求数组的最大值和最小值: 数组排序(SORT的原理->localeCompare实现汉字比较),取头取尾 假设法 利用APPLY传参传递的是一个数组的机制,借用M ...

  9. C++走向远洋——36(数组做数据成员,工资)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:salarly.cpp * 作者:常轩 * 微信公众号:Worl ...

  10. Python神经网络编程笔记

    神经元 想一想便知道,当一个人捏你一下以至于你会痛得叫起来的力度便是神经元的阈值,而我们构建的时候也是把这种现象抽象成一个函数,叫作激活函数. 而这里便是我们使用sigmoid函数的原因,它是一个很简 ...