提出:在编写五子棋的程序中,有存盘退出和续上盘的功能
问题:该二维数组有很多默认值为0,记录了许多没有意义的数据
解决:稀疏数组
思路:棋盘压缩--->二维数组-稀疏数组储存-二维数组
1.根据要求创建一个二维数组(0表示无子,1表示黑子,2表示白子)
2.稀疏数组条件(1.总行数总列数 2.共有多少个值 —>形成3行 sum+1列的二维数组)
3.因此需要遍历二维数组得到sum(共有多少个有值内容)
4.生成稀疏数组
5.给稀疏数组赋值
6.稀疏数组转为二维数组
具体代码实现:
public class Sparsearray {
public static void main(String[] args) {
//创建一个5*6的原始二维数组
//给二维数组非0的赋值
//0表示无子,1表示黑子,2表示黑子
int[][] arr =new int[5][6];
System.out.println(arr.length);
arr[1][1]=1;
arr[2][2]=2;
arr[2][4]=1;
arr[3][5]=2;
//生成二维数组
for (int[] a : arr) {
for (int data : a) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//转为稀疏数组
//遍历获得sum
int sum=0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
if (arr[i][j]!=0){
sum++;
}
}
}
//创建稀疏数组
int [][]arr1=new int[sum+1][3];
arr1[0][0]=5;
arr1[0][1]=6;
arr1[0][2]=sum;
System.out.println("------");
// for (int[] row:arr1){
// for (int data : row) {
// System.out.printf("%d\t",data);
// }
// System.out.println();
// }
//给稀疏数组赋值
int x=1;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
if (arr[i][j]!=0){
arr1[x][0]=i+1;
arr1[x][1]=j+1;
arr1[x][2]=arr[i][j];
x++;
}
}
}
for (int[] row:arr1){
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//稀疏数组转为二维数组
int[][]arr2=new int[arr1[0][0]][arr1[0][1]];
//遍历稀疏数组把有值的部分赋给二维数组
for (int i = 1; i < arr1.length; i++) {
arr2[arr1[i][0]-1][arr1[i][1]-1]=arr1[i][2];
}
System.out.println("---------");
for (int[] row:arr2){
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
另外一种:
public class Sparsearray {
public static void main(String[] args) {
int[][]arr=new int[5][6];
arr[1][1]=1;
arr[2][2]=2;
arr[2][4]=2;
for (int[] a :
arr) {
for (int data :
a) {
System.out.printf("%d\t",data);
}
System.out.println();
}
int sum=0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
if (arr[i][j]!=0){
sum++;
}
}
}
System.out.println("-------");
int[][]arr2=new int[sum+1][3];
arr2[0][0]=5;
arr2[0][1]=6;
arr2[0][2]=sum;
// for (int i = 0; i < arr2.length; i++) {
// System.out.printf("%d\t%d\t%d\t\n",arr2[i][0],arr2[i][1],arr2[i][2]);
// }
int x=1;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
if (arr[i][j]!=0){
arr2[x][0]=i;
arr2[x][1]=j;
arr2[x][2]=arr[i][j];
x++;
}
}
}
for (int i = 0; i < arr2.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",arr2[i][0],arr2[i][1],arr2[i][2]);
}
int[][]arr3=new int[arr2[0][0]][arr2[0][1]];
for (int i = 1; i < arr2.length; i++) {
arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];
}
System.out.println("---------");
for (int[] a :
arr3) {
for (int data :
a) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
效果截图:
第一种:
第二种: