go例子(二) 使用go语言实现数独游戏

例子托管于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

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()

}

原文地址:https://www.cnblogs.com/Bin-DuS/p/10158441.html

时间: 2024-11-08 21:02:31

go例子(二) 使用go语言实现数独游戏的相关文章

C语言学习 数独游戏

摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 Win64) 参考: 互动百科 数独 章节: 正文: 原来也用C#和Go语言写过,主要思路是暴力撞大运破解.思路什么的在程序了都注释了,不多说了.可能是没用什么先进的算法,感觉C解题速度和C#差不多(除了C#第一次运行之外),基本上出来一个数独表都不用1秒. 附完整程序: 1 /*********************

Linux平台上SQLite数据库教程(二)——C语言API介绍

Linux平台上SQLite数据库教程(二)--C语言API介绍 前言:本文将介绍几个基本的SQLite3数据库的C语言API接口,主要用到两个文件:sqlite3.c.sqlite3.h.源码地址:https://github.com/AnSwErYWJ/SQLite. 打开数据库 1.原型: int sqlite3_open( const char* filename, /* 数据库文件名, 必须为 UTF-8 格式 */ sqlite3** ppDB /* 输出: SQLite 数据库句柄

QT开发(五十二)———QML语言

QT开发(五十二)---QML语言 QML是一种声明语言,用于描述程序界面.QML将用户界面分解成一块块小的元素,每一元素都由很多组件构成.QML定义了用户界面元素的外观和行为:更复杂的逻辑则可以结合JavaScript脚本实现. 一.QML基础语法 1.Import语句 QML代码中,import语句一般写在头几行,主要用途如下:     A.包含类型的全名空间     B.包含QML代码文件的目录     C.JavaScript代码文件 格式如下: import Namespace Ver

总结文件操作函数(二)-C语言

格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf(stdout,format,-); int scanf(const char *format, -); int fprintf(FILE *stream, const char *format, ...);      //中间的参数为写入文件的格式 int fscanf(FILE *stream, const

嵌入式linux面试题解析(二)——C语言部分二

嵌入式linux面试题解析(二)--C语言部分二 1..h头文件中的ifndef/define/endif 的作用?    答:防止该头文件被重复引用. 2.#include 与 #include "file.h"的区别?    答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h. 3.描述实时系统的基本特性    答 :在特定时间内完成特定的任务,实时性与可靠性. 4.全局变量和局部变量在内存中是否有区别?如果有,是

二、Java语言的简单认识及Hello World示例

1. Java语言的简单认识 (1) Java有三个版本: a. JAVA SE (以前称J2SE):Standard Environment 标准版本: b. JAVA EE (以前称J2EE):Enterprise Environment 企业版: c. JAVA ME (以前称J2ME):Eicro Environment 微型版; (2) Java的安装目录 在前一讲中,提到安装目录中有两个文件夹,分别是jdk1.7.0_45和jre7.在"jdk1.7.0_45"文件夹的bi

嵌入式linux面试题解析(二)——C语言部分三

嵌入式linux面试题解析(二)--C语言部分三 1.下面的程序会出现什么结果#include <stdio.h>#include <stdlib.h> #include <string.h>void getmemory(char *p){    p=(char *) malloc(100);    strcpy(p,"hello world");}int main( ){    char *str=NULL;    getmemory(str); 

Cocos2d-x 系列二之C语言

1.宏定义<1>.常量定义 #define MATH_PI 3.14 void defineH() { // 宏在编译阶段就把宏对应的常量给替换了,所以很快: printf("%f", MATH_PI); } <2>.方法定义 // 定义宏方法,宏方法没有具体的返回类型:当多行的时候,在后面添加一个反斜杠: #define MAX(A,B) {\ A>B?A:B } 调用:MAX(12,30): 2.结构体<1>.结构体定义 struct Pe

C++语言学习(十二)——C++语言常见函数调用约定

C++语言学习(十二)--C++语言常见函数调用约定 一.C++语言函数调用约定简介 C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数就会出现堆栈异常等现象.上述现象出现在C和C++的代码混合使用的情况下或在C++程序中使用第三方库(非C++语言开发)的情况下,原因是函数调用约定(Calling Convention)和函数名修饰(Decorated Name)规则导致的.函数调用约定决定函数参数入栈的顺序,以及由调用者函数还是被