稀疏数组案例练习

blog day1

需求分析

现有某行某列棋盘,棋盘上随机分布有部分棋子(棋子数目多,这样才有压缩价值)
现在需要存储棋子的位置,如果使用正常的二维数组,数组太大,而且在棋盘开始下棋时,会造成大量无效的数据,所以此处选择稀疏数组这种数据结构节省空间

image

上面棋盘的棋子位置假设以左上角为(0,0),白字设为1,黑子设为2,无子设为0
2
1
1

由此可以定义一个棋盘数组

int checkerBoard[][] = new int[10][10];
checkerBoard[1][2] = 2;
checkerBoard[2][2] = 1;
checkerBoard[3][1] = 1;

打印棋盘需要用到二维数组的遍历

for(int i = 0; i < 10; i++){
	for(int j = 0; j < 10; j++){
		System.out.printf("%d\t", checkerBoard[i][j]);
	}
	System.out.println();
}

需要通过棋子的计数来获取稀疏数组的最大行数,稀疏数组的列数则为,一列为所有棋子行数,一列为所有棋子的列数,一列为棋子的特征值

// 进行棋子计数
int count = 0;
for(int i = 0; i < 10; i++){
	for(int j = 0; j < 10; j++){
		if(checkerBoard[i][j] != 0){
			count++;
		}
	}
}
// 创建一个稀疏数组[conut + 1][3]
int[][] data = new int[count + 1][3];
data[0][0] = 10;
data[0][1] = 10;
data[0][2] = count;

重新遍历一次棋盘,把所有棋子的数据填入稀疏数组

// 遍历棋盘存储每个棋子的位置及参数到稀疏数组
int rowCount = 0;
for(int i = 0; i < 10; i++){
	for(int j = 0; j < 10; j++){
		if(checkerBoard[i][j] != 0){
			rowCount++;
			data[rowCount][0] = i;
			data[rowCount][1] = j;
			data[rowCount][2] = checkerBoard[i][j];
		}
	}
}

打印稀疏数组

// 打印此时的稀疏数组
for(int i = 0; i < count + 1; i++){
	System.out.printf("%d\t%d\t%d\t\n", data[i][0], data[i][1], data[i][2]);
	}

数据写入文件

从文件中读取数据

上面两步在IO里面,还没学

// TODO 后续增加IO操作

遍历稀疏数组提取数据放到新棋盘

int[][] checkerBoard2 = new int[data[0][0]][data[0][1]];
for(int i = 1; i < count + 1; i++){
    checkerBoard2[data[i][0]][data[i][1]] = data[i][2];
}

// 打印新棋盘
for(int i = 0; i < data[0][0]; i++){
    for(int j = 0; j < data[0][1]; j++){
        System.out.printf("%d\t", checkerBoard2[i][j]);
    }
    System.out.println();
}

知识点

  1. 稀疏数组的数据结构
  2. 练习二维数组的遍历
  3. 格式化输出的写法
posted @ 2021-05-27 21:58  Rainful  阅读(88)  评论(0编辑  收藏  举报