稀疏数组
实际需求
编写的五子棋程序中,有存盘退出和续上盘的功能
分析:如果使用二维数组解决问题,二维数组很多默认值是0,记录了很多没有意义的数据
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
处理方法:
1)记录数组一共几行几列,有多少不同的值
2)把具有不同值的元素的行列及值记录在一个小规模数组中,从而缩小程序的规模
应用实例:
1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等)
2)把稀疏数组存盘,并且可以重新恢复原来的二维数组数
3)整体思路分析
type Node struct{
row int
col int
val int
}
4)代码实现
package main
import "fmt"
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 _,v1 :=range v{
fmt.Printf("%d\t",v1)
}
fmt.Println()
}
//3.转成稀疏数组
//思路
//(1)遍历chessMap,如果发现有一个元素值不为0,创建一个node结构体
//(2)将其放到对应的切片中
var sparseArr []ValNode
valNode := ValNode{
row : 11,
col : 11,
val : 0,
}
sparseArr =append(sparseArr,valNode)
//标准稀疏数组应该还有一个记录元素的二维数组的规模(行列,默认值)
for i,v := range chessMap{
for j,v1 :=range v{
if v1 != 0{
//创建一个ValNode值结点
valNode := ValNode{
row : i,
col : j,
val : v1,
}
sparseArr = append(sparseArr,valNode)
}
}
}
//输出稀疏数组
fmt.Println("当前的稀疏数组是:")
for key,val :=range sparseArr{
fmt.Printf("%d: %d %d %d\n",key,val.row,val.col,val.val)
}
}
运行结果: