美文网首页
使用稀疏数组保存五子棋棋盘数据

使用稀疏数组保存五子棋棋盘数据

作者: iDevOps | 来源:发表于2019-08-19 10:54 被阅读0次
需求

编写一个五子棋程序, 要有存盘退出和续上盘的功能,怎么保存棋盘数据?


棋盘

编程思路:
创建一个二维数组, 数字0代表没有棋子, 1表示黑子, 2表示蓝子, 来保存棋盘数据

但是这样会有一个问题?
二维数组中会存在很多值是默认值0, 因此记录了很多没有意义的数据

怎么解决?
我们可以尝试使用稀疏数组来解决这个问题, 使用稀疏数组的解决方法就是记录数组有多少行多少列,有多少个值,把不同的值的元素的行列和值记录在一个小规模的数组中, 看下图

解决方案
我们可以使用稀疏数组来保存棋盘数据,把稀疏数组存盘,使用的时候再把稀疏数组转为二维数组。

原始数组和对应的稀疏数组
二维数组和稀疏数组互转
  • 二维数组转稀疏数组思路
  1. 遍历原始数组, 得到有效数据的个数num
  2. 根据行数、列数和元素个数num创建稀疏数组
  3. 将二位数组的有效数据存入到稀疏数组
  • 稀疏数组转二位数组思路
  1. 先根据稀疏数组的第一行数据创建原始的二维数组
  2. 再读取稀疏数组后几行的数据, 并赋值给原始二维数组即可
代码实现
  • Java
public class Sparse {

    /**
     * 原始数组转稀疏数组
     * @param arr 原始数组
     * @return 稀疏数组
     */
    static int[][] Array2Sparse(int[][] arr){
        //1. 原始二维数组几行几列
        int row = arr.length;
        int column = arr[0].length;
        //2. 一共几个有效元素
        int num = 0;
        for (int i=0; i<arr.length; i++){
            for(int j=0; j<arr[i].length; j++){
                if(arr[i][j] != 0){
                    num ++;
                }
            }
        }
        //3. 创建稀疏数组
        int[][] sparseArr = new int[num+1][3];
        //4. 二维数组转稀疏数组
        sparseArr[0][0] = row;
        sparseArr[0][1] = column;
        sparseArr[0][2] = num;
        int count = 0;
        for (int i=0; i<arr.length; i++){
            for(int j=0; j<arr[i].length; j++){
                if(arr[i][j] != 0){
                    count ++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr[i][j];
                }
            }
        }
        return sparseArr;
    }

    /**
     * 稀疏数组转二维数组
     * @param sparseArr 稀疏数组
     * @return 原始数组
     */
    static int[][] Sparse2Arr(int[][] sparseArr){
        //1. 创建二维数组
        int[][] arr = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2. 稀疏数组转二维数组
        for(int i=1; i<sparseArr.length; i++){
            arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        return arr;
    }

    /**
     * 控制台输出二维数组
     * @param arr
     */
    static void printArr(int[][] arr){
        for (int i=0; i<arr.length; i++){
            for(int j=0; j<arr[i].length; j++){
                System.out.printf("%d\t", arr[i][j]);
            }
            System.out.println();
        }
    }


    public static void main(String[] args) {
        //1. 初始化一个二维数组
        int[][] arr = new int[11][11];
        arr[1][2] = 1;
        arr[2][5] = 3;
        arr[4][6] = 5;

        //2. 二维数组转稀疏数组
        int[][] sparseArr = Array2Sparse(arr);
        System.out.println("原始数组:");
        printArr(arr);
        System.out.println("稀疏数组:");
        printArr(sparseArr);

        //3. 稀疏数组转二维数组
        int[][] arr1 = Sparse2Arr(sparseArr);
        System.out.println("原始数组:");
        printArr(arr1);
    }
}

输出: 
原始数组:
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   0   0   3   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   5   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   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  3   
1   2   1   
2   5   3   
4   6   5   
原始数组:
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   0   0   3   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   5   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   0   0   0

相关文章

  • 使用稀疏数组保存五子棋棋盘数据

    需求 编写一个五子棋程序, 要有存盘退出和续上盘的功能,怎么保存棋盘数据? 编程思路:创建一个二维数组, 数字0代...

  • 稀疏数组 & 环形队列

    一、稀疏数组 1、是什么?比如有一个 11 * 11 的五子棋盘,我们要用程序模拟,那肯定就是二维数组。然后用1表...

  • Java数据结构与算法分析 | 稀疏数组

    五子棋游戏的存取需求 在介绍稀疏数组前我们先来引入一个需求,下面是一个五子棋的棋盘(15 * 15),玩到中途时想...

  • 二、Java数据结构-稀疏数组(sparsearray)

    什么时候使用稀疏数组 当一个数组中大部分元素为零,或者为用一个数值的时候,可以使用稀疏数组来保存该数组; 稀疏数组...

  • 稀疏数组

    二维数组转成稀疏数,案例(五子棋),思路:1.获取二维数组中有效数据的个数.2.稀疏数组的列数为3,行数通过有效数...

  • 稀疏数组

    稀疏数组 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方式是:记...

  • 二维数组和稀疏数组转换并存盘

    稀疏数组可以节约存储空间,以围棋棋盘举例,正常一个10*10的棋盘需要用到二维数组的数据结构来表示 int[10]...

  • 算法面经:稀疏数组

    稀疏数组 一、应用场景 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数...

  • Java中稀疏数组的使用

    稀疏数组 当一个数组中大部分元素是0,或者是一个相同的值时,可以使用稀疏数组来保存该数组。并且稀疏数组,行数为:原...

  • canvas 五子棋游戏

    效果 代码 思路 创建数组用于保存五子棋的位置即可。输赢判断使用遍历即可重复落棋用判断保存的数组的位置是否已经有棋...

网友评论

      本文标题:使用稀疏数组保存五子棋棋盘数据

      本文链接:https://www.haomeiwen.com/subject/cdnjsctx.html