例子托管于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. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-mock(8)

    mock, 较7属于代码优化 # -*- coding: utf-8 -*- # @Time : 2020/2/12 8:40 # @File : learn_mock_8.py # @Author: ...

  2. mudbox安装未完成,某些产品无法安装的解决方法

    mudbox提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装mudbox失败提示mudbox安装未完成,某些产品无法安装,也有时候想重新安装mudbox的时候 ...

  3. unittest(23)- python发邮件

    import smtplib import time from email.mime.multipart import MIMEMultipart from email.mime.text impor ...

  4. maven创建Java项目命令

    1.maven创建普通Java项目的命令 mvn archetype:create -DgroupId=packageName -DartifactId=projectName 2.maven创建Ja ...

  5. java23种设计模式 (转)

    文章在:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 随着自己的开发经验增加以及自己做了很多的 大专栏  jav ...

  6. Java 并发编程 -- Fork/Join 框架

    概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的 ...

  7. Redis(1)——5种基本数据结构

    一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...

  8. Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解

    题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4,你应该返回 ...

  9. Python2.7错误处理FileNotFoundError报错NameError: name 'FileNotFoundError' is not defined

    错误信息如下: 原因是FileNotFoundError是python3.0中的写法,而Python2.7中应写为IOError.

  10. SpringMVC 使用注解完成登录拦截

    目录 为了实现用户登录拦截你是否写过如下代码呢? 1. 基于Filter 2. 基于Struts 3. 基于SpringMVC 如何使用自定义注解完成自定义拦截呢? 登录注解 SpringMVC 拦截 ...