【数算-01】稀疏数组

65 阅读2分钟
public class SparseArray {

//     创建一个原始的二维11*11数组
//     0表示当前位置没有棋子 1表示黑子 2表示蓝子

//    将二维数组转为稀疏数组的思想:
//    1.遍历二维数组得到非0数据的个数
        int num = 0;
        for (int i = 0;i<chessArr1.length;i++){
            for (int j=0;j<chessArr1[i].length;j++){
                if(chessArr1[i][j] != 0){
                    num++;
                }
            }
        }
//     2.创建对应的稀疏数组:
        int sparseArr[][] = new int[num+1][3];

//     3.给稀疏数组赋值
//		稀疏数组的第0行第0列为原数组的行数
        sparseArr[0][0] = chessArr1.length;
//      稀疏数组的第0行第1列为原数组的列数
        sparseArr[0][1] = chessArr1[0].length;
//      稀疏数组的第0行第2列为原数组中含非0元素的个数
        sparseArr[0][2] = num;
//     4.遍历二维数组 将非0值存放入稀疏数组中

//     记录是第几个非零数据 每获得一个非零数据就++
        int count = 0;

        for (int i = 0; i < chessArr1.length; i++) {
           for (int j=0;j<chessArr1[i].length;j++){
               if(chessArr1[i][j]!=0){
                   count++;
                   sparseArr[count][0] = i;
                   sparseArr[count][1] = j;
                   sparseArr[count][2] = chessArr1[i][j];
               }
           }
        }

//        输出稀疏数组
        System.out.println("得到的稀疏数组为:");
        for(int i=0;i<sparseArr.length;i++){
            for(int j=0;j<sparseArr[i].length;j++){
                System.out.print(sparseArr[i][j]+"\t");
            }
            System.out.println();
        }

//      5.还原二维数组:
//        从稀疏数组的第一行中获取原数组的行列数并由此定义新数组
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//        将数组中的所有元素暂定为0(默认为0就不用置0了!)
//        for (int i=0;i<col;i++){
//            for(int j=0;j<raw;j++){
//                chessArr2[i][j] = 0;
//            }
//        }
//        逐行读取稀疏数组中记录的非0数的位置与值
        for(int i = 1;i < sparseArr.length;i++){
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        System.out.println("由稀疏数组还原所得的二维数组为:");
        for (int i=0;i<chessArr2.length;i++){
            for(int j=0;j<chessArr2[i].length;j++){
                System.out.print(chessArr2[i][j]+"\t");
            }
            System.out.println();
        }


    }
}

//测试:
public static void main(String[] args) {
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        System.out.println("原始的二维数组为:");
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1[i].length; j++) {
                System.out.printf(chessArr1[i][j] + "\t");
            }
            System.out.println("\n");
        }