稀疏 sparsearray 数组-----编写五子棋程序中,存盘退出和续上盘的功能

import scala.collection.mutable.ArrayBuffer

/**
  * 稀疏 sparsearray 数组
  * 编写的五子棋程序中,有存盘退出和续上盘的功能。
  * 分析问题:
  * 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组
  *
  * 基本介绍
  * 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
  *
  * 稀疏数组的处理方法是:
  * 1) 记录数组一共有几行几列,有多少个不同的值
  * 2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
  *
  * 应用实例
  * 1) 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
  * 2) 把稀疏数组存盘,并且可以从新恢复原来的二维数组数
  */
object SparseArr {
  def main(args: Array[String]): Unit = {
    val rowSize = 11
    val colSize = 11

    //演示一个稀疏数组的使用
    //ofDim方法可以构建一个多维数组
    val chessMap = Array.ofDim[Int](rowSize, colSize)
    //初始化地图
    chessMap(1)(2) = 1 //1表示黑子
    chessMap(2)(3) = 2 //2表示白子
    //输出原始地图,遍历
    for (item <- chessMap) {
      for (item2 <- item) {
        printf("%d\t", item2)
      }
      println()
    }

    //将 chessmap 转成稀疏数组
    // 思路 =》 效果是达到对数据的压缩
    val sparseArr = ArrayBuffer[Node]()
    //放入第一个元素,值默认为0
    val node = new Node(rowSize, rowSize, 0)
    sparseArr.append(node)
    //压缩数组成稀疏数组
    for (i <- 0 until chessMap.length) {
      for (j <- 0 until chessMap(i).length) {
        //判断该值是否为 0, 如果不为 0,就保存
        if (chessMap(i)(j) != 0) {
          //构建一个node
          val node = new Node(i, j, chessMap(i)(j))
          sparseArr.append(node) //加入到稀疏数组
        }

      }
    }
    println("--------稀疏数组----------")
    for (node <- sparseArr) {
      printf("%d\t%d\t%d\n", node.row, node.col, node.value)

    }

    //读盘 -> 稀疏数组
    //稀疏数组-> 原始数组
    //读取稀疏数组的第一个节点
    val newNode = sparseArr(0)
    val rowSize2 = newNode.row
    val colSize2 = newNode.col
    //构建一个新的原始数组
    val chessMap2 = Array.ofDim[Int](rowSize2, colSize2)
    for (i <- 1 until sparseArr.length) {
      val node = sparseArr(i)
      chessMap2(node.row)(node.col) = node.value

    }

    println("-----------从稀疏数组恢复后的地图---------------")
    for (item <- chessMap2) {
      for (item2 <- item) {
        printf("%d\t", item2)

      }
      println()

    }
  }

}

class Node(val row: Int, val col: Int, val value: Int)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值