- 需求:编写五子棋游戏时,有存盘退出和续上盘的功能。
- 问题:因为二维数组的很多值默认为0,因此记录了很多没有意义的数据。这时,就需要通过稀疏数组来解决。
- 处理方式:1.记录数组一共有几行几列,有多少个不同。2.把不同值的元素和行列及值记录在一个小规模的-数组中,从而缩小程序的规模。
- 如下图:
现在,让我们动手来实现一个稀疏数组。
1.应用实例
1)创建棋盘
- 0:表示没有棋子
- 1:表示黑棋
- 2:表示白棋
int sum=0;
array1[1][2]=1;
array1[2][3]=2;
for(int i=0;i<11;++i)
{
for(int j=0;j<11;++j)
{
System.out.print(array1[i][j]+"\t");
}
System.out.println();
}
2)运行结果
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
2.压缩
-
左侧是原始的二维数组
10x10 = 100 个格子,右侧是稀疏数组7 x 3 = 21 个格子 -
[0]:记录了棋盘的大小,10 行 10 列,棋盘上有 7 个不为 0 的值 -
其他行:分别记录每一个非 0 值的所在行、所在列、值
比如
[1]:在第 0 行第 5 列上有一个 7(这里的行列都是下标)
可以看到原始 100 个数据,压缩成 21 个数据。一定程度上压缩了数据。
- 那么现在同样对我们在11*11的基础上进行压缩
1)获取有效值
{
for(int j=0;j<11;++j)
{
if(array1[i][j]!=0)
{
sum++;
}
}
}
2)创建一个新的数组
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
int count=0;
for(int i=0;i<11;++i)
{
for(int j=0;j<11;++j)
{
if(array1[i][j]!=0)
{
count++;
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array1[i][j];
}
}
}
3.输出稀疏数组
{
for(int j=0;j<array2[i].length;++j)
{
System.out.print(array2[i][j]+"\t");
}
System.out.println();}
}
输出结果
1 2 1
2 3 2