思想
先定义一个动态二维数组并遍历数组中的每一个元素并打印出来,给相应的元素赋值,其余元素均为0(动态数组会自动给没赋值的元素默认为0);遍历数组中的每个元素并计算非零值的个数sum,此时再定义一个二维数组当作稀疏数组,行数为非零值个数加1,列数为3;遍历原数组的每个元素并将非零值的行数和列数以及其元素值存储在二维数组中,首行存储原数组的总行数和总列数以及非零值的个数;
还原二维数组:定义第三个二维数组为还原后的二维数组,行数和列数分别为稀疏矩阵的第0行第0列和第1列,遍历稀疏矩阵并将非零值的行数和列数以及元素值赋值给新数组,打印新数组。
运行截图:
代码如下:
// 9. 棋盘
// 9.1创建一个二维数组 11*11 0:没有棋子 1:黑棋 2:白棋
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
System.out.println("输出原始的数组:");
for(int[] ints : array1) // 遍历每一行数组元素
{
for (int k : ints) // 遍历一行的每一列数组元素
{
System.out.print(k+"\t");
}
System.out.println();
}
// 9.2 获取有效值的个数
int sum = 0;
for(int i = 0; i < 11; i++)
{
for(int j = 0; j < 11; j++)
{
if(array1[i][j] != 0)
{
sum++;
}
}
}
System.out.println("有效值的个数为:"+sum);
// 9.3 创建一个稀疏矩阵的数组
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
int count = 1;
for(int i = 0; i < 11; i++)
{
for(int j = 0; j < 11; j++)
{
if(array1[i][j] != 0)
{
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
count++;
}
}
}
// 9.4 输出稀疏矩阵
System.out.println("稀疏矩阵:");
for(int[] ints : array2) // 遍历每一行数组元素
{
for (int k : ints) // 遍历一行的每一列数组元素
{
System.out.print(k+"\t");
}
System.out.println();
}
// 9.5 还原稀疏数组
System.out.println("===========================================");
System.out.println("还原为:");
int[][] array3 = new int[array2[0][0]][array2[0][1]];
// 9.6 给其中的元素还原它的值
for(int i = 0; i < array2[0][2]; i++)
{
array3[array2[i+1][0]][array2[i+1][1]] = array2[i+1][2];
}
for(int[] ints : array3)
{
for(int k : ints)
{
System.out.print(k+"\t");
}
System.out.println();
}