目录
一、五子棋问题与稀疏数组的联系
- 可以使用稀疏数组来保存类似棋盘、地图等的二维数组。
- 把棋盘问题对应为二维数组问题。
二、为什么要把数组转换为稀疏数组
- 二维数组的默认值为0,当数组中记录的很多数值没有实际意义时,可以将该数组转换为稀疏数组。
- 例:将棋盘中的黑白棋子各看为1和2,其余没有棋子的地方则为0,此时二维数组中将有大量0,并无实际意义。可以将该二维数组转换为稀疏数组。
三:将二维数组转换为稀疏数组的思路:
- 将二维数组中具有实际意义的数字个数记为sum,则稀疏数组行数(row) = sum+1;列数(col)为3。
- 稀疏数组的形式:row col value
- 稀疏数组第一行为二维数组的总行数、总列数、有实际意义的数值个数。
- 剩余行为对应的有意义的数值所在行和所在列以及它的值。
四:代码中所用知识
- 增强 for 循环
- 二位数组实质上也是一维数组,只不过每个数组元素都是另一个一维数组的地址。
例:int arr[ ][ ] = new int [3][4]; 创建了一个二维数组,有三个元素,每一个元素又 是一个一维数组,里面包含四个元素。
- 遍历二维数组,使用嵌套循环。
外层循环获取数组的所有一维数组,内层循环遍历一维数组中的每个元素。
int arr[][] = new int[3][4];
arr[2][3] = 3;
for(int[] i:arr){//外层循环得到每个一维数组,即得到的是数组
for(int s:i){//内层循环遍历一维数组中的数
System.out.print(s+"\t");
// System.out.printf("%d\t",s);
}
System.out.println();
}
五:代码实现
package day_01;
public class Main {
public static void main(String[] args) {
int sum = 0;
int arr[][] = new int[11][11];
arr[1][2] = 1;
arr[2][3] = 2;
//输出初始二维数组
System.out.println("初始的二位数组为: ");
for(int[] i:arr) {
for(int s:i) {
System.out.printf("%d\t", s);
// System.out.print(s+"\t");
if(s != 0) {
sum++;
}
}
System.out.println();
}
//创建稀疏数组,将二维数组转换为稀疏数组
int sparseArr[][] = new int[sum+1][3];
int count = 0;
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
for(int i = 0;i<11;i++) {
for(int j = 0;j<11;j++) {
if(arr[i][j]!=0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arr[i][j];
}
}
}
System.out.println("稀疏数组");
for(int[] i:sparseArr) {
for(int s:i) {
System.out.print(s+"\t");
}
System.out.println();
}
//将稀疏数组转为二维数组
System.out.println("重新转化为的二维数组为:");
int chessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
for(int[] i:chessArr) {
for(int s:i) {
System.out.print(s+"\t");
}
System.out.println();
}
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了对应于棋盘、地图等的二维数组与稀疏数组间的转换。