JAVA算法-稀疏数组(棋盘游戏)
目录
一、稀疏sparsearray数组和队列
二维数组转稀疏数组的思路思路分析(存盘):
-
遍历原始的二维数组,得到有效数据的个数sum;
-
根据sum就可以创建稀疏数组sparseArr int[sum+1] [3(固定值)]
-
将二维数组的有效数据存入到稀疏数组中
稀疏数组转原始的二维数组的思路(读盘):
-
先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组;
-
在读取稀疏数组后几行的数据,并赋给原始的二维数组即可;
2.1.1 Sparse代码实现
绘制棋盘并初始化棋盘
public static int[][] chessBoard() {
// 定义一个原始二维数组的9*9棋盘
// 其中0:表示没有棋子,●表示黑子,○表示白子;
int[][] boardArr = new int[9][9];
// 初始化棋盘,给棋盘赋值绘制原始二维数组棋盘
boardArr[2][3]='●';
boardArr[3][4]='○';
boardArr[4][5]='●';
//打印列标
System.out.println(" 0 1 2 3 4 5 6 7 8");//可用循环遍历棋盘数组的长度(为了偷懒hhh)
int i = 0;//列标
//循环遍历已创建的空棋盘boardArr[][]
for (int[] rows : boardArr) {
//可用普通for循环打印列标
System.out.print(" "+i);
i++;
for (int data : rows) {
if (data == 0) {
data = '+';
}
System.out.print(" " + (data == 43 ? "+" : (char) data));
}
//打印换行符
System.out.println();
}
}
return boardArr;
}
上述代码运行结果():
保存棋局(存盘操作):
/**
* 将原始数组的有效数据存入到一个新的二维数组(稀疏数组)中
*
* @param boardArr 原始二维数组
*/
public static int[][] toSparseArr(int[][] boardArr) {
/**
* 稀疏数组的有效数据
* 行标 行 列 值
*--------------------
* 0 9 9 3
* 1 2 3 1
* 2 3 4 2
* 3 4 5 1
*
*/
// 遍历原始二维数组,得到有效数据的个数
int sum = 0;
for (int[] rows : boardArr) {
for (int data : rows) {
if (data != 0) {
sum++;
}
}
}
// System.out.println("有效数据的个数为:"+sum);
// 新建一个二维数组,用来存储原始数组的有效数据,新数组的长度为原始二维数组的有效数据个数加一
int[][] sparseArr = new int[sum + 1][3];
// 将棋盘的行列数和有效数据的个数保存到稀疏数组中去
sparseArr[0][1] = sparseArr[0][0] = boardArr.length;
sparseArr[0][2] = sum;
// 记录是第几个非0数据
int count = 0;
// 将原二维数组中的数据保存到sparseArr稀疏数组中
for (int i = 0; i < boardArr.length; i++) {
for (int j = 0; j < boardArr.length; j++) {
if (boardArr[i][j] != 0) {
count++;
// 保存有效数据的行号
sparseArr[count][0] = i;
// 保存有效数据的列号
sparseArr[count][1] = j;
// 保存有效数据的值
sparseArr[count][2] = boardArr[i][j];
}
}
}
// 遍历稀疏数组,打印稀疏数组的数据信息
System.out.println(" 正在打印存盘信息...");
for (int[] is : sparseArr) {
for (int is2 : is) {
System.out.print(" " + is2);
}
System.out.println();
}
System.out.println(" 系统提示:存盘并退出成功!");
return sparseArr;
}
上述代码执行结果:
注:这里的9679是'●'的ASCII码值,9675是'○'的ASCII码值。
读盘操作:
/**
* 从稀疏数组中读取数据恢复成原始二维数组
*
* @param sparseArr 稀疏数组
*/
public static void toChessBoard(int[][] sparseArr) {
System.out.println();
System.out.println(" 正在读盘...");
// 新建一个二维数组
int[][] chessBoard = new int[sparseArr[0][0]][sparseArr[0][0]];
for (int i = 1; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr.length; j++) {
chessBoard[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
}
for (int[] rows : chessBoard) {
for (int data : rows) {
if (data == 0) {
data = '+';
}
System.out.print(" " + (data == 43 ? "+" : data));
}
System.out.println();
}
System.out.println(" 读盘成功,请继续游戏!");
}
上述代码执行结果:
当我们我们要把数组中的数据存储到本地时,由于数组中大部分的元素为0,又或者说我们所需要的数据是少量的,那么我们可以将二维数组转化为稀疏数组。
例如,上面的棋盘,或者说是迷宫等简单小游戏。
好了,以上就是二维数组转稀疏数组的方法,第一次发博,有错的地方希望大家多多指教,也希望大家能够指出我的错误和不好的地方,谢谢大家。