zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Go 稀疏数组模拟棋盘矩阵

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>