二维数组与稀疏数组的相互转化

package struct;

public class SparseArr {    public static void main(String[] args) {        int chess[][] = new int[11][11];        //0代表空白,1代表黑子,2代表蓝子        chess[1][2] = 1;        chess[2][3] = 2;        int sum = 0;        //获取有效值个数        for (int[] rows : chess) {            for (int data : rows) {                System.out.printf("%d\t", data);                if (data != 0) {                    sum++;                }            }            System.out.println();        }        //创建稀疏数组        int[][] sparseArr = new int[sum + 1][3];        //给稀疏数组赋值        sparseArr[0][0] = 11;//棋盘的行数        sparseArr[0][1] = 11;//棋盘的列数        sparseArr[0][2] = sum;//棋盘上的棋子个数        //二维数组的长度为行数        int count = 1;        for (int i = 0; i < chess.length; i++) {            for (int j = 0; j < chess[0].length; j++) {                if (chess[i][j] != 0) {                    sparseArr[count][0] = i;                    sparseArr[count][1] = j;                    sparseArr[count][2] = chess[i][j];                    count++;                }            }        }        //输出稀疏数组        for (int i = 0; i < sparseArr.length; i++) {            System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);        }        //还原二维数组        int[][] chess1Arr = new int[sparseArr[0][0]][sparseArr[0][1]];        //给二维数组赋值        for (int i = 1; i < sparseArr.length; i++) {            for (int j = 0; j < sparseArr[0].length; j++) {                chess1Arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];            }        }        //输出二维数组        for (int i = 0; i < chess1Arr.length; i++) {            for (int j = 0; j < chess1Arr[0].length; j++) {                System.out.printf("%d\t", chess1Arr[i][j]);            }            System.out.println();        }    }}

原文地址:https://www.cnblogs.com/kukai/p/10992004.html

时间: 2024-11-08 05:56:55

二维数组与稀疏数组的相互转化的相关文章

稀疏数组的经典应用(二维数组与稀疏数组的相互转换)

package com.zhangwl.数据结构.稀疏数组; /** * @ClassName SparseArray * @Description 棋盘游戏演示 * @Author zhangwl * @Date 2019/10/10 22:54 * @Version 1.0 **/public class SparseArray { public static void main(String[] args) { /*创建一个原始的二维数组11 * 11 ,0:表示没有棋子 :1:表示黑子:

二维数组转稀疏数组、稀疏数组恢复二维数组(Java实现)

public static void main(String[] args) { // 创建一个原始的二维数组 9*9 int chessArr1[][] = new int[9][9]; // 0表示没有棋子,1表示黑子,2表示白子 chessArr1[1][2] = 1; chessArr1[2][3] = 2; chessArr1[5][2] = 2; chessArr1[7][6] = 2; chessArr1[8][4] = 1; System.out.println("原始的二维数组

将二维数组转为稀疏数组

public class SparseArray { /** * 用二维数组实现一个棋盘,1代表黑子,2代表蓝子 */ public static void main(String[] args) { /** * 二维数组 */ int[][] chessArray1 = new int[11][11]; chessArray1[1][2] = 1; chessArray1[2][3] = 2; for (int[] row : chessArray1) { for (int data : ro

数据结构之二维数组与稀疏数组的转换

1.二维数组 二维数据其实就是高数中的矩阵,在此不做过多的解释 2.稀疏数组 当一个二维数组中大多值为0,或者相同时,我们可以考虑用到稀疏数组,来减少内存 稀疏数组的处理方法: 1)一个有3列的二维数组,记录原数组有几行几列,多少个不同的值 2)不同值的元素的所在行以及列记录在稀疏数组中,从而缩小规模 3.例子如下: 4.下面是稀疏数组以及二维数组之间的转换 package com.ebiz.array; /** * @author YHj * @create 2019-07-13 16:46

hdu1081 DP类最长子段和(二维压缩+前缀和数组/树状数组计数)

题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少. 由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j)与(i,j - 1), dp 值代表以该点为右下角的最大矩阵和,同时记录下这个矩阵的左上角坐标,状态转移时通过将原和最大矩阵通过补边推到当前和最大矩阵.但是其实这种做法有一个明显的问题,就是转移时,补上边后 dp 值相同怎么办,dp 值相同而矩阵不同的话会影响到下一次状态转移后补上的矩阵的情况,从而

二维最大和子数组

1.设计思路 因为计算了一位的最大和子数组,所以想办法将二维的数组转换成一维子数组进行求解: 首先,将二维数组的第一行(列)赋值到新的一维数组中,在一维的数组中求得子数组的最大值, 然后,将二维数组的第二行(列)加到一维数组中,再次求得子数组的最大值,并和第一步求得的最大值进行比较,若新的值比较大,留下最大值,如果新值比较小,退出这一个循环,从第二行(列)开始第一步,这样就可以求出最大和子数组: 2.源代码 #include<iostream> #include<ctime> us

$[SHOI2007]$ 园丁的烦恼 二维数点/树状数组

\(Sol\) 设一个矩阵的左上角为\((x_1,y_1)\),右下角为\((x_2,y_2)\),\(s_{x,y}\)是到\((1,1)\)二维前缀和,那么这个矩阵的答案显然是\(s_{x_2,y_2}-s_{x_1-1,y_2}-s_{x_2,y_1-1}+s_{x_1-1,x_2-1}\).考虑把每个询问拆成这么四个二维前缀和的询问.将所有询问的\(s_{x,y}\)按照\(x\)排序,依次计算,这样我们就可以忽略\(x\)的限制而只考虑\(y\)的限制了.每次扫到一个询问,先把\(x\

【BZOJ】1047: [HAOI2007]理想的正方形(单调队列/~二维rmq+树状数组套树状数组)

http://www.lydsy.com/JudgeOnline/problem.php?id=1047 树状数组套树状数组真心没用QAQ....首先它不能修改..而不修改的可以用单调队列做掉,而且更快,只有O(n^2).而这货是n^2log^2n的建树...虽然查询是log^2n...但是建树那里就tle了.. 那么说题解... 先orz下,好神.. 我怎么没想到单调队列orz 首先我们维护 行 的单调队列,更新每个点在 列 距离内的最小and最大的值 然后我们维护 列 的单调队列,更新每个点

poj 2155 Matrix(二维树树状数组)

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 19113   Accepted: 7193 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1