为什么要稀疏数组
在五子棋游戏中,用二维数组记录棋盘,棋盘上数字0代表空,1代表玩家1的棋子,2代表玩家2的棋子,刚开始时棋盘上很多数字都是0,因此这个二维数组记录了很多无意义数据,这时就引入了稀疏数组。
稀疏数组介绍
- 当一个数组中大部分元素为0,或者为同一值时,可以用稀疏数组来保存该数组
- 稀疏数组的处理方式是:
- 记录数组一共有几行几列,有几个不同的值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
- 如下两表,第一个是原始数组,第二个是稀疏数组
0 | 0 | 0 | 22 | 0 | 0 | 15 |
---|---|---|---|---|---|---|
0 | 11 | 0 | 0 | 0 | 17 | 0 |
0 | 0 | 0 | -6 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 39 | 0 |
91 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 28 | 0 | 0 | 0 | 0 |
行 | 列 | 值 | |
---|---|---|---|
[0] | 6 | 7 | 8 |
[1] | 0 | 3 | 22 |
[2] | 0 | 6 | 15 |
[3] | 1 | 1 | 11 |
[4] | 1 | 5 | 17 |
[5] | 2 | 3 | -6 |
[6] | 3 | 5 | 39 |
[7] | 4 | 0 | 91 |
[8] | 5 | 2 | 28 |
实现数组转换为稀疏数组及逆应用
假设有一个11*11的五子棋盘,第二行第三个位置为黑棋,第三行第四个位置为白棋,把它转化为稀疏数组储存,并实现把稀疏数组转化为原数组
代码实现:
public class xsxz
{
public static void main(String[] args)
{
//创建一个11*11的二维数组 0:没有棋子 1:黑棋 2:白棋
int[][] arr1 = new int[11][11];
arr1[1][2] = 1;
arr1[2][3] = 2;
//输出原始数组
System.out.println("输出原始的数组:");
for (int[] ints : arr1)
{
for (int anInt : ints)
{
System.out.print(anInt + "\t");
}
System.out.println();
}
//转换为稀疏数组并保存、输出,用sum读取除0外值的个数
int sum = 0;
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
if (arr1[i][j] != 0)
{
sum++;
}
}
}
System.out.println("除0外值的个数为:" + sum);
//创建一个稀疏数组的数组
int[][] arr2 = new int[sum + 1][3];
arr2[0][0] = 11;
arr2[0][1] = 11;
arr2[0][2] = sum;
//遍历二维数组,将非零的值,存放稀疏数组中
int count = 0;
for (int i = 0; i < arr1.length; i++)
{
for (int j = 0; j < arr1[i].length; j++)
{
if (arr1[i][j] != 0)
{
count++;
arr2[count][0] = i;
arr2[count][1] = j;
arr2[count][2] = arr1[i][j];
}
}
}
//打印arr2数组
for (int[]ints:arr2)
{
for (int anInt:ints)
{
System.out.print(anInt+"\t");
}
System.out.println();
}
//到这里,我们就完成一半的人物了
//还原
//创建一个新数组来接收值
int[][] arr3=new int[arr2[0][0]][arr2[0][1]];
//将稀疏数组还原为原数组,i从1开始,因为arr2的第一行不是非零值
for (int i = 1; i < arr2.length; i++)
{
arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];//把非零值还原,而其他位置默认为0
}
//打印
for (int[]ints:arr3)
{
for (int anInt:ints)
{
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}
跟着代码和其中的注释,多看几遍并动手亲自写,肯定能搞懂!