题目:从控制台输入一数字,根据输入的数字,输出对应层数的矩阵,并填值
假设输入的是奇数,中间留一块为核心,外层包裹着核心
假设是偶数,最中间是一个2*2的方块组成核心,外层包裹着核心
填值的话,填该层所在的层数,假设输入2,有两层,第二层里面就填2
一道比较有意思的题目,主要是对数组的索引控制
可以用递归的思想,每次填最外面一层,之后缩小数组索引,缩小输入值,再次填”最外面“一层
除此之外,考虑使用二维数组来存储这个矩阵,但问题是,二维数组的下标
二维数组的下标是从左上角开始,并且从0开始,类似一个坐标值,
考虑对这个数组控制,大概需要的值有
1.数组的大小
2.开始的下标值
3.一个循环来递进
代码以下:
import java.util.Scanner;
/**
* 一些声明信息
*
* @author 谢柯
* @date: 2022/7/22 19:39
* @description: 输出数字矩形
* 输入的数字为奇数,中间留一
* 输入的数字为偶数,中间不留
* @since JDK 1.17
*/
public class TestNumberArray {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("输入一个整数");
int inNumber = in.nextInt();
// 观察得知,偶数时,数组大小为 偶数*2
// 奇数时,数组大小为 奇数+(奇数-1)
if (inNumber % 2 == 0) {
// 偶数
// 创建数组
int intArray[][] = new int[inNumber * 2][inNumber * 2];
// 数组 数组大小 输入数字 数组开始下标
out(intArray, inNumber * 2, inNumber, 0);
System.out.println("最后输出");
out(intArray, inNumber * 2);
} else {
// 奇数
// 创建数组
int intArray[][] = new int[inNumber + (inNumber - 1)][inNumber + (inNumber - 1)];
// 数组 数组大小 输入数字 数组开始下标
out(intArray, inNumber + (inNumber - 1), inNumber, 0);
System.out.println("最后输出");
out(intArray, inNumber + (inNumber - 1));
}
}
// intArray数组 arraySize数组大小 inNumber输入数字 staArrayIndex数组填值开始位置
public static void out(int[][] intArray, int arraySize, int inNumber, int staArrayIndex) {
// 递归边界条件
if (inNumber == 0) {
return;
}
//这个值有多种用途,可以记录递归的层数,记录已经填写数字的层数(需要+1)
//这个值在这里的用途是,记录要填的这层,在数组中的下标,
int fixedIndex= staArrayIndex;
for (int i = staArrayIndex; i < arraySize; i++) {
//在填值时,一次要填两行两列(第一行,最后一行,第一列,最后一列)
// 这里需要注意二维数组的组成方式,二维数组像叠罗汉,每一行是一个独立的数组
// 第一行 数组下标 循环
// 第一列 循环 数组下标
// 最后一行 数组大小-1 循环
// 最后一列 循环 数组大小-1
// 第一列填值
intArray[i][fixedIndex] = inNumber;
// 第一行填值
intArray[fixedIndex][i] = inNumber;
// 最后一行填值
intArray[arraySize - 1][i] = inNumber;
// 最后一列填值
intArray[i][arraySize - 1] = inNumber;
}
// 递归调用,每次填最外面一层
out(intArray, arraySize - 1, inNumber - 1, staArrayIndex + 1);
}
// 输出函数
public static void out(int[][] a, int b) {
for (int i = 0; i < b; i++) {
for (int j = 0; j < b; j++) {
System.out.printf("%6d", a[i][j]);
}
System.out.println();
}
}
}