算法题——数字矩阵

题目:从控制台输入一数字,根据输入的数字,输出对应层数的矩阵,并填值

假设输入的是奇数,中间留一块为核心,外层包裹着核心

 

假设是偶数,最中间是一个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();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值