问题:
现在有一个五子棋盘,如下,需要你进行存盘,然后以后在玩的时候还可以继续上一盘,你可以直接把这个11X11的棋盘直接保存到一个二维数组中,然后写进文件夹,但是你会发现,此时11X11的棋盘只有3个数据,其他都是无用的,占用内存空间,这显然转换成稀疏矩阵在存储,明显可以省略很多空间,接下来我们用Java代码模拟把它转换成稀疏矩阵,再从稀疏矩阵还原成原矩阵。
首先我们定义一个跟棋盘大小
的二维数组,然后给对应的位置赋值。
//五子棋盘矩阵转换成稀疏矩阵,规定白为 1 ,黑为 2
//先定义五子棋棋盘,放置对应棋子
int sum = 0; //棋盘中数据的个数
int array1[][] = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
array1[3][4] = 2;
for (int i=0;i<array1.length;i++){
for (int j=0;j<array1[0].length;j++){
System.out.printf("%d\t",array1[i][j]);
if (array1[i][j]!=0){
++sum;
}
}
System.out.printf("\n");
}
输出结果看一下:
0 0 0 0 0 0 0 0 0 0 0
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 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
第二步:定义一个稀疏矩阵,稀疏矩阵第一行就是就是原矩阵的行数列数和数据个数,下面就是每个数据的行数列数和数据值。
上面原矩阵可以转换成这样的稀疏矩阵 ,具体代码实现:
//将矩阵转换成稀疏矩阵
//1、定义稀疏矩阵:因为稀疏矩阵有三列,行数是数据的个数加上第一行记录原矩阵的信息
int array2[][] = new int[sum+1][3];
//2、给稀疏矩阵赋值
array2[0][0] = array1.length;
array2[0][1] = array1[0].length;
array2[0][2] = sum;
//3、遍历array1将数据存入array2中
int count=0;//用于稀疏矩阵行数自增
for (int i=0;i<array1.length;i++){
for (int j=0;j<array1[0].length;j++){
if (array1[i][j]!=0){
++count;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
然后我们输出稀疏矩阵看看:
//输出稀疏矩阵查看效果
for (int i=0;i<array2.length;i++){
for (int j=0;j<array2[0].length;j++){
System.out.printf("%d\t",array2[i][j]);
}
System.out.printf("\n");
}
11 11 3
1 2 1
2 3 2
3 4 2
此时我们已经将原矩阵转换成稀疏矩阵了。
最后我们根据稀疏矩阵转换成正常矩阵并输出:
//将稀疏矩阵还原成原矩阵
//1、根据稀疏矩阵定义原矩阵的大小
int array3[][] = new int[array2[0][0]][array2[0][1]];
//2、遍历稀疏矩阵将数据放入原矩阵
for (int i=1;i<array2.length;i++){
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//遍历恢复后的矩阵,查看结果
for (int i=0;i<array3.length;i++){
for (int j=0;j<array3[0].length;j++){
System.out.printf("%d\t",array3[i][j]);
}
System.out.printf("\n");
}
0 0 0 0 0 0 0 0 0 0 0
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 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
至此,我们已经完成了将矩阵转换稀疏矩阵,和稀疏矩阵还原成原矩阵。如果你会使用io流的话,你可以尝试着转换成稀疏矩阵存入文件,然后读取文件,将稀疏矩阵转换成原矩阵。
源代码:
public class Matrix2SparseMatrix {
public static void main(String[] args) {
//五子棋盘矩阵转换成稀疏矩阵,规定白为 1 ,黑为 2
//先定义五子棋棋盘,放置对应棋子
int sum = 0; //棋盘中数据的个数
int array1[][] = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
array1[3][4] = 2;
for (int i=0;i<array1.length;i++){
for (int j=0;j<array1[0].length;j++){
System.out.printf("%d\t",array1[i][j]);
if (array1[i][j]!=0){
++sum;
}
}
System.out.printf("\n");
}
System.out.println("--------------------------------------------------------------------");
//将矩阵转换成稀疏矩阵
//1、定义稀疏矩阵:因为稀疏矩阵有三列,行数是数据的个数加上第一行记录原矩阵的信息
int array2[][] = new int[sum+1][3];
//2、给稀疏矩阵赋值
array2[0][0] = array1.length;
array2[0][1] = array1[0].length;
array2[0][2] = sum;
//3、遍历array1将数据存入array2中
int count=0;//用于稀疏矩阵行数自增
for (int i=0;i<array1.length;i++){
for (int j=0;j<array1[0].length;j++){
if (array1[i][j]!=0){
++count;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
//输出稀疏矩阵查看效果
for (int i=0;i<array2.length;i++){
for (int j=0;j<array2[0].length;j++){
System.out.printf("%d\t",array2[i][j]);
}
System.out.printf("\n");
}
System.out.println("--------------------------------------------------------------------");
//将稀疏矩阵还原成原矩阵
//1、根据稀疏矩阵定义原矩阵的大小
int array3[][] = new int[array2[0][0]][array2[0][1]];
//2、遍历稀疏矩阵将数据放入原矩阵
for (int i=1;i<array2.length;i++){
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//遍历恢复后的矩阵,查看结果
for (int i=0;i<array3.length;i++){
for (int j=0;j<array3[0].length;j++){
System.out.printf("%d\t",array3[i][j]);
}
System.out.printf("\n");
}
}
}