六、稀疏数组

需求:编写五子棋游戏中,有存盘退出和续上盘的功能。

分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。

解决:稀疏数组

 

 

public class Demo04 {



    //稀疏数组
    public static void main(String[] args) {

        System.out.println("==============================");

        int[][] nums1 = new int[11][11];
        //0:无子;1:黑子;2:白子;
        nums1[1][2]=1;
        nums1[2][3]=2;

        //输出原棋盘
        printArrays(nums1);

        System.out.println("==============================");

        //有效棋子数
        int count=0;
        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums1[i].length; j++) {
                if (nums1[i][j]!=0){
                    count++;
                }
            }
        }

        //稀疏数组
        //count+1是因为多存了一个头,记录棋盘横坐标长度、纵坐标长度和有效记录数。
        //头下面就开始记录横纵坐标和该位置的值。
        int[][] nums2 = new int[count+1][3];

        //第一列存横坐标,第二列存纵坐标,第三列存值
        nums2[0][0]=11;
        nums2[0][1]=11;
        nums2[0][2]=count;

        //稀疏数组游标row
        int row=0;

        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums1[i].length; j++) {
                if (nums1[i][j]!=0){
                    row++;
                    nums2[row][0]=i;
                    nums2[row][1]=j;
                    nums2[row][2]=nums1[i][j];
                }
            }
        }

        //输出稀疏数组
        printArrays(nums2);


        System.out.println("==============================");

        //稀疏数组还原为原棋盘
        int[][] nums3 = new int[nums2[0][0]][nums2[0][1]];

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


        printArrays(nums3);
    }

    //打印二维数组
    public static void printArrays(int[][] arrays){
        for (int i = 0; i < arrays.length; i++) {
            System.out.println(Arrays.toString(arrays[i]));
        }
    }
}

 

posted @ 2022-05-12 03:20  Epiphany8Z  阅读(18)  评论(0编辑  收藏  举报