专栏首页浅枫沐雪二维数组与稀疏矩阵的互转

二维数组与稀疏矩阵的互转

  • 应用: 五子棋棋盘的棋子的存档问题
  • 思路构图:

xishu.jpg

  • SparseArray.java 运行结果
原始数组:
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数据的总数为sum=2
原始二维数组转换的稀疏矩阵为:
11    11    2    
1    2    1    
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 

下面是源代码

java
package cn.allms.sparseArray;
/**
 * 稀疏矩阵与二维数组的转化
 * @author QFMX
 *
 */
public class SparseArray {
    public static void main(String[] args) {
        // 创建数组
        int[][] arr1 = new int[11][11];
        // 初始化数组,给数组赋值,0代表无子,1代表黑子,2代表蓝子
        arr1[1][2] = 1;
        arr1[2][3] = 2;
        // 遍历数组生成棋盘
        System.out.println("原始数组:");
        for (int[] row : arr1) {
            for (int i : row) {
                System.out.printf(i + " ");
            }
            System.out.println();
        }
        // 二维数组转稀疏矩阵
        // 1. 获取需要生成稀疏矩阵的行的总数:非0数据的总数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (arr1[i][j] != 0) {
                    sum += 1;
                }
            }
        }
        System.out.println("非0数据的总数为sum=" + sum);
        // 2. 创建稀疏矩阵
        int sparseArr[][] = new int[sum + 1][3];
        // 3. 初始化稀疏矩阵的第一行: 原始二维数组的 行 列 非0数据的个数
        sparseArr[0][0] = 11; // 行
        sparseArr[0][1] = 11; // 列
        sparseArr[0][2] = sum; // 非0数据的个数
        // 4. 使用for遍历二维数组出非0数据赋值给稀疏矩阵
        int count = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (arr1[i][j] != 0) { // 找到了元数组的非0数据,然后开始赋值
                    count++; // 找到了非0数据,用于更新稀疏矩阵的行
                    sparseArr[count][0] = i; // 原来二维数组的行标
                    sparseArr[count][1] = j; // 原二维数组的列标
                    sparseArr[count][2] = arr1[i][j]; // 原二维数组的数据
                }
            }
        }
        // 5. 输出稀疏矩阵
        System.out.println("原始二维数组转换的稀疏矩阵为:");
        // 遍历数组
        for (int i = 0; i < sparseArr.length; i++) {
            for (int j = 0; j < sparseArr.length; j++) {
                System.out.printf(sparseArr[i][j] + "\t");
            }
            System.out.println();
        }

        // 稀疏据矩阵转原始二维数组
        // 1. 根据稀疏矩阵的第一行数据创建原始二维数组
        int row = sparseArr[0][0];
        int col = sparseArr[0][1];
        // 2. 创建二维数组
        int arr2[][] = new int[row][col];
        // 3. 读取稀疏矩阵为创建二维数组赋值
        for (int i = 1; i < sparseArr.length; i++) {

            int r = sparseArr[i][0]; //获取行标
            int c = sparseArr[i][1]; //获取列表
            arr2[r][c] = sparseArr[i][2]; //设置行和列并且赋值

        }
        // 输出稀疏矩阵转二维数组

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • js的基本数据类型

    深浅无解
  • JAVA字符串反转

    深浅无解
  • 史上最简单的制作Linux启动盘教程

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite...

    深浅无解
  • Matlab系列之数据类型

    数值型的数据包括有符号和无符号的整数(int)、单精度(single)和双精度(double)浮点数(float);

    狂人V
  • 【MATLAB 从零到进阶】day3 矩阵 数组

    矩阵的除法包括左除(A\B)、右除(A/B)和点除(A./B)三种。一般情况下,x=A\b是方程组A*x=b的解,而x=b/A 是方程组x*A=b的解,x=A....

    统计学家
  • 二维数组简介与使用

    前言 本文将探讨一下关于二维数组在内存中的存储和二维数组在参数传递时的使用。 一、二维数组在内存中的存储 如果定义一个这样的二维数组int a[3][4]={{...

    用户1215536
  • 数据结构基础(一)数组,矩阵

    有一个等式,数据结构+算法=程序,说明了数据结构对于计算机程序设计的重要性。数据结构是指数据元素的集合(或数据对象)及元素间的相互关系和构造方法。数据对象中元素...

    AlbertYang
  • C/C++:使用二维数组名传参

    在 C 中,当二维数组作为实参向形参传递时,参数会自动转化为指针类型,这时如果我们使用二维数组名传参,我们就不得不在函数形参中指明二维数组的第一维的长度,否则会...

    英雄爱吃土豆片
  • 【转载】理解矩阵(三)

    下面让我们把视力集中到一点以改变我们以往看待矩阵的方式。我们知道,线性空间里的基本对象是向量,而向量是这么表示的:

    marsggbo
  • 【自考】数据结构第三章,数组,期末不挂科指南,第5篇

    一维数组元素的内存单元地址是连续的 二维数组可有两种存储方法:一种是以列序为主序的存储;另一种是以行序为主序的存储。 ==C语言中,数组采用的是以行序为主序...

    梦想橡皮擦

扫码关注云+社区

领取腾讯云代金券