需求:编写五子棋游戏中,有存盘退出和统上盘的功能。
例如图中所示:
分析发现数组中很多值都相同,因此记录了一堆没有意义的数据,增加读取负担,此时就可以用稀疏数组。
稀疏数组介绍:
-
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
-
稀疏数组的处理方式是:记录数组中一共有几行几列,有多个不同的值,把具有不同值的元素的行和列及值存在一个小规模的数组中从而缩短数据
如下图
PHP示例代码:
$row = 11;
$col = 11;
// 构建棋盘
$array1 = array_fill(0, $row, array_fill(0, $col, 0));
echo '输出原始棋盘数组 0没有 1黑 2白' . PHP_EOL;
$nums = 0;
// 赋值
$array1[1][2] = 1;
$array1[2][3] = 2;
foreach ($array1 as $i => $value) {
foreach ($value as $j => $one) {
echo $one . "\t";
if ($one !== 0) {
$nums++;
}
}
echo PHP_EOL;
}
// 查询有效的数量
echo "有效值的数量" . $nums . PHP_EOL;
//创建稀疏数组
$array2 = [];
$array2[0] = [$row, $col, $nums];
foreach ($array1 as $i => $value) {
foreach ($value as $j => $one) {
if ($one !== 0) {
$array2[] = [$i, $j, $one];
}
}
}
echo '输出稀疏数组' . PHP_EOL;
foreach ($array2 as $value) {
echo "{$value[0]}\t{$value[1]}\t{$value[2]}" . PHP_EOL;
}
echo '还原稀疏数组' . PHP_EOL;
$array3 = array_fill(0, $array2[0][0], array_fill(0, $array2[0][1], 0));
foreach ($array2 as $key => $value) {
if ($key === 0)
continue;
$array3[$value[0]][$value[1]] = $value[2];
}
foreach ($array3 as $i => $value) {
foreach ($value as $j => $one) {
echo $one . "\t";
if ($one !== 0) {
$nums++;
}
}
echo PHP_EOL;
}
JAVA示例代码:
package study.array;
/**
* 稀疏数组
*/
public class Demo02 {
public static void main(String[] args) {
// 创建二维数组 11*11 0没有 1黑 2白
System.out.println("原有棋盘 0没有 1黑 2白");
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
// 输出原始棋盘数组
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
// 换行
System.out.println();
}
System.out.println("=================");
// 转换为稀疏数组
// 获取有效值的人数
int sums = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
sums++;
}
}
}
System.out.println("有效个数" + sums);
// 创建一个稀疏数组
int[][] array2 = new int[sums + 1][3];
array2[0][0] = 11;// 总行数
array2[0][1] = 11;// 总列数
array2[0][2] = sums;// 值
// 遍历二维数组将非0存进去
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
System.out.println("稀疏数组:");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0] + "\t" + array2[i][1] + "\t" + array2[i][2]);
}
System.out.println("=================");
System.out.println("还原棋盘");
int[][] array3 = new int[array2[0][0]][array2[0][1]];
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
// 还原原始棋盘数组
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
// 换行
System.out.println();
}
}
}