java稀疏数组五子棋存盘复盘

java稀疏数组五子棋存盘复盘

稀疏sparsearray数组

当一个数组中大部分元素为0,或同一个值的数组时,可以使用稀疏数组来保存该数组

处理方式:
1.记录数组一共有几行几列,有多少个不同的值
2.把具有不同值的元素的行或列以及值记录在一个小规模的数组中,从而缩小程序的规模

在这里插入图片描述
第[0] 记录的是原始数组的行和列还有一共有多少个有效的值,[0]也就是第一行后面保存的是每个具体的值所在的坐标位置。

五子棋存盘复盘 0是默认 1 是黑 2是蓝
在这里插入图片描述
二维数组转稀疏数组的思路

1.遍历原始的二维数组,得到有效数据的个数sum
2.根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
*sum+1 为什么要+1 sum是有效数据,+1是[0]所存储的行列和有效个数
3.将二维数组的有效数据存入到稀疏数组

稀疏数组转原始的二维数组的思路

1.先读取稀疏数组的第一行[0],根据第一行的数据,创建原始的二维数组,比如上面的chessArr2=int[11][11]
2.再读取稀疏数组后几行的数据,并赋给原始的二维数组即可

具体实现

package com.zjx.spasearray;
/**
 * 稀疏数组实现五子棋存盘复盘
 * @author Zjx
 *
 */
public class SparseArray {
	public static void main(String[] args){
		//创建原始的二维数组棋盘 11 * 11
		//0表示没有棋子 1表示黑子 2表示蓝子
		int ROW = 11;
		int COL = 11;
		int chessArr1[][] = new int[ROW][COL];
		chessArr1[1][2] = 1;//第二行第三列有一个黑子
		chessArr1[2][3] = 2;//第三行第四列有一个蓝子
		//输出原始的棋盘----->>>二位数组
		System.out.println("原始的棋盘");
		for(int[] row: chessArr1){//遍历二位数组的行
			//取到了每一行
			for(int data : row){//遍历每一行 取到具体的值
				System.out.printf("%d\t", data);//打印具体的数字
			}
			System.out.println();//每打印完一行换行
		}
		//将棋盘----->>>二位数组 转为稀疏数组
		//1.遍历二维数组 得到非0数据个数
		int sum = 0;//记录数量
		for(int i = 0; i < ROW; i++){	//第一层循环遍历行
			for(int j = 0; j < COL; j++){  //第二层循环遍历列
				if(chessArr1[i][j] != 0){
					sum++;//记录有效个数
				}
			}
		}
		System.out.println("sum = "+sum);
		//2.创建对应的稀疏数组
		//行是有效个数 加上 行列有效数据那一条数据  列是固定散列  行 列 值
		int sparseArr1[][] = new int[sum+1][3];
		//3.给稀疏数组赋值
		//保存二维数组的棋盘大小和有效个数
		sparseArr1[0][0] = ROW;
		sparseArr1[0][1] = COL;
		sparseArr1[0][2] = sum;
		//System.out.printf("%d\t%d\t%d\t\n", sparseArr1[0][0],sparseArr1[0][1],sparseArr1[0][2]);
		//遍历二维数组非0的值 保存具体每个数的位置和值
		int count = 0;//用于记录是第几个非0数据
		for(int i = 0; i < ROW; i++){	//第一层循环遍历行
			for(int j = 0; j < COL; j++){  //第二层循环遍历列
				if(chessArr1[i][j] != 0){
					count++;//第一次进来就是1了 
					//代表第一次找到存到 稀疏数组的第二行  因为第一行已经存了棋盘大小以及有效个数
					//下次遭到就变成2 第三行 以此类推
					sparseArr1[count][0] = i; //棋子所在的行
					sparseArr1[count][1] = j; //棋子所在的列
					sparseArr1[count][2] = chessArr1[i][j]; //棋子的值
				}
			}
		}
		//输出稀疏数组的形式
		System.out.println();
		System.out.println("得到的稀疏数组为~~~~");
		for(int i = 0; i < sparseArr1.length; i++){//遍历行数
			//第一行就是 第一行第一个 行坐标  第一行第二个列坐标  第一行第三个具体的值 以此类推
			System.out.printf("%d\t%d\t%d\t\n", sparseArr1[i][0],sparseArr1[i][1],sparseArr1[i][2]);
		}
		System.out.println();
		//将稀疏数组复盘为原始的二维数组
		/*
		 1.先读取稀疏数组的第一行[0],根据第一行的数据,创建原始的二维数组,比如上面的chessArr2=int[11][11]
		 2.再读取稀疏数组后几行的数据,并赋给原始的二维数组即可
		 */
		//原本棋盘sparseArr1[0][0] 行  sparseArr1[0][1]列 sparseArr1[0][2]值
		int chessArr2[][] = new int[sparseArr1[0][0]][sparseArr1[0][1]];
		//遍历稀疏数组第一行之后几行数据,赋值给原始棋盘 
		for(int i = 1; i < sparseArr1.length; i++){
			//假如i是1
			//稀疏数组第一行第一列 是棋盘的行
			//稀疏数组第一行第二列 是棋盘的列
			//稀疏数组第一行第三列 是具体的值
			chessArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
		}
		System.out.println("恢复后的棋盘");
		for(int[] row: chessArr2){//遍历二位数组的行
			//取到了每一行
			for(int data : row){//遍历每一行 取到具体的值
				System.out.printf("%d\t", data);//打印具体的数字
			}
			System.out.println();//每打印完一行换行
		}
	}
}

在这里插入图片描述

发布了18 篇原创文章 · 获赞 2 · 访问量 1487

猜你喜欢

转载自blog.csdn.net/AppWhite_Star/article/details/104395933