Go 稀疏数组模拟棋盘矩阵
2023-09-11 14:14:56 时间
稀疏数组
应用示例
1、使用稀疏数组来保留类似前面的二维数组(棋盘、地图等待)
2、把稀疏数组存盘,并且可以从新恢复原理的二维数组。
1 创建一个原始数组
package main
import "fmt"
func main() {
// 1、先创建一个原始数组
var chessMap [11][11]int
chessMap[1][2] = 1 // 黑子
chessMap[2][3] = 2 // 篮子
// 2、输出看看原始的数组
for _, v := range chessMap {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
}
PS E:\TEXT\test_go\one> go run .\main.go
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
PS E:\TEXT\test_go\one>
2 转成稀疏数组
package main
import "fmt"
// 3.1 创建一个mode结构体
type ValNode struct {
row int
col int
val int
}
func main() {
// 1、先创建一个原始数组
var chessMap [11][11]int
chessMap[1][2] = 1 // 黑子
chessMap[2][3] = 2 // 篮子
// 2、输出看看原始的数组
for _, v := range chessMap {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
// 3、转成稀疏数组
/*思路
1、遍历 chessMap,如果我们发现有一个元素的值不为0,创建一个mode结构体。
2、将其放入到对应的切片即可
*/
// 稀疏数组通过切片来实现
var sparseArr []ValNode
// 标准的一个稀疏数组应该还有一个,记录元素的二维数组的规模(行和列,默认值)
// 初始节点
valNode := ValNode{
row: 11,
col: 11,
val: 0,
}
sparseArr = append(sparseArr, valNode)
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
// 创建一个 ValNode 值节点
valNode := ValNode{
row: i,
col: j,
val: v2,
}
sparseArr = append(sparseArr, valNode)
}
}
}
// 输出稀疏数组
fmt.Println("当前的稀疏数组是:::::::")
for i, valNode := range sparseArr {
fmt.Printf("%d:%d %d %d\n", i, valNode.row, valNode.col, valNode.val)
}
}
PS E:\TEXT\test_go\one> go run .\main.go
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
当前的稀疏数组是:::::::
0:11 11 0
1:1 2 1
2:2 3 2
PS E:\TEXT\test_go\one>
3 稀疏数组恢复恢复原始数据
package main
import (
"fmt"
)
// 3.1 创建一个mode结构体
type ValNode struct {
row int
col int
val int
}
func main() {
// 1、先创建一个原始数组
var chessMap [11][11]int
chessMap[1][2] = 1 // 黑子
chessMap[2][3] = 2 // 篮子
// 2、输出看看原始的数组
for _, v := range chessMap {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
// 3、转成稀疏数组
/*思路
1、遍历 chessMap,如果我们发现有一个元素的值不为0,创建一个mode结构体。
2、将其放入到对应的切片即可
*/
// 稀疏数组通过切片来实现
var sparseArr []ValNode
// 标准的一个稀疏数组应该还有一个,记录元素的二维数组的规模(行和列,默认值)
// 初始节点
valNode := ValNode{
row: 11,
col: 11,
val: 0,
}
sparseArr = append(sparseArr, valNode)
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
// 创建一个 ValNode 值节点
valNode := ValNode{
row: i,
col: j,
val: v2,
}
sparseArr = append(sparseArr, valNode)
}
}
}
// 输出稀疏数组
fmt.Println("当前的稀疏数组是:::::::")
for i, valNode := range sparseArr {
fmt.Printf("%d:%d %d %d\n", i, valNode.row, valNode.col, valNode.val)
}
/*
将稀疏数组,存盘 d:/chesmap.data
如何恢复原始的数组
1、打开这个 d:/chesmap.data =》 恢复原始数据
2、这里使用稀疏数组恢复
*/
// 先创建一个原始数组
var chessMap2 [11][11]int
// 遍历 sparseArr
for i, v := range sparseArr {
//跳过第一行的记录值,第一行的记录值用于定义需要多大的二维数组范围值
if i != 0 {
chessMap2[v.row][v.col] = v.val
}
}
// 看看 chessMap2 是否恢复原始数据
for _, v := range chessMap2 {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
}
PS E:\TEXT\test_go\one> go run .\main.go
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
当前的稀疏数组是:::::::
0:11 11 0
1:1 2 1
2:2 3 2
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
PS E:\TEXT\test_go\one>
相关文章
- k8s client-go源码分析 informer源码分析-初始化与启动分析
- GO:格式化代码
- The "Go" Learning Trip -- 1. Hello Go, Frist “go” Code -- Part1-1
- 为什么在Go中我们需要使用Mock测试(附源码)
- go使用go-redis操作redis(一)安装及示例
- go手记
- Go 延迟函数 defer 详解
- Go语言基本语法 (下)
- 使用GoLand创建Go项目(含环GOPATH/GOROOT环境配置)
- Go基础系列:读取标准输入
- Go基础系列:Go slice详解
- 解决go get无法下载依赖的问题
- SwiftUI 精品项目之完整Go围棋游戏App支持在线对战OGS Alamofire SocketIO(教程含源码)
- GO语言练习:网络编程 TCP 示例
- 初识GO语言——安装Go语言
- protoc-gen-go: unable to determine Go import path for "xxx.proto"
- Go最新版下载 Go1.20版新特性
- Go语言实现HashSet