• CoreJava逻辑思维-顺时针打印自定义矩阵


    CoreJava逻辑思维-顺时针打印自定义矩阵

    这两天回顾了一下刚入Java时的一些比较有意思的逻辑题,曾经也费劲脑汁的思考过的一些问题,比如百钱百鸡最简单的算法啦之类的,而今天博主想说的是一个循环打印指定字符的一道问题。上题目。


    从控制台输入两个数字代表矩阵的行列数,并顺时针回旋打印出从1-矩阵可以存放元素的个数

    例:接收数据 4 4 ,则打印出的图形为:

    1   2   3   4

    12 13 14 5

    11 16 15 6
    10   9   8  7

    此处博主只给出了一种解决方案,欢迎有想法的小伙伴可以给出更简单的方法。

    博主以前的解决方案为(为什么说以前呢,因为最近真的是没什么时间去考虑新方法了)

    思路

    既然是个矩阵,那么博主首先想到的就是使用二维数组来解决此事,那么问题来了,如何将1-m*n按照这样的规律存进数组便是解体的关键(其实跟没说一样,知道这种规律直接打印好了)

    闲话不多说,现在博主召唤出四大圣使来解决这个问题吧。

    朱雀:第一行,我是自增的。

    白虎:最后一列,我也是自增的。

    玄武:最后一行,我是递减的!!

    青龙:第一列,除去第一个元素我也是递减的。

    艾玛,别说了,博主知道了,

    //定义一个二维数组,用来存储矩阵元素
    int[][] array = new int[m][n]; 
    //定义两个变量,用来控制待填充元素的位置
    int i,j;
    //定义一个计数器,用来代表矩阵元素。
    int count = 0;
    

    准备的差不多了。那就上代码吧~最笨的方法见下。

    
        /*计数器*/
        private static int count = 0;
        /**/
        private static int i = 0;
        /*控制台接收输入参数*/
        private static Scanner input = new Scanner(System.in);
    
        //程序入口
        public static void main(String[] args) {
            System.out.println("请输入两个数作为行列");
            int m = input.nextInt();
            int n = input.nextInt();
            /*初始化一个m行n列的二维数组*/
            int[][] array = new int[m][n];
            /*初始值设为1*/
            int num = 1;
            count = m / 2;
            if (m % 2 != 0) {
                count++;
            }
            int sum = m * n ;
            //对元素进行排序
            array = getNums(array, m, n, num,sum);
            //打印数组元素
            printArray(array, m, n);
            input.close();
        }
    
        /**
         * 根据输入行列值初始化数据
         *
         * @param array 空数组
         * @param m     行
         * @param n     列
         * @param num   数据从1开始
         * @return 赋值后数组
         */
        private static int[][] getNums(int[][] array, int m, int n, int num,int sum) {
            //遍历行
            for (int j = i; j < n; j++) {
                array[i][j] = num;
                num++;
                if (num > sum) {
                    return array;
                }
            }
            //固定列,四边形最右边的数据
            for (int j = i + 1; j < m; j++) {
                array[j][n - 1] = num;
                num++;
                if (num > sum) {
                    return array;
                }
            }
            //固定行,四边形最下面的数据
            for (int j = n - 2; j > i; j--) {
                array[m - 1][j] = num;
                num++;
                if (num > sum) {
                    return array;
                }
            }
            //固定列,四边形最左边一列的数据
            for (int j = m - 1; j > i; j--) {
                array[j][i] = num;
                num++;
                if (num > sum) {
                    return array;
                }
            }
            n--;
            m--;
            i++;
            if (i == count) {
                return array;
            }
            return getNums(array, m, n, num,sum);
        }
    
        /**
         * 输出数组中所有元素
         *
         * @param array 待输出数组
         * @param m     行
         * @param n     列
         */
        private static void printArray(int[][] array, int m, int n) {
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    System.out.print(array[i][j] + "	");
                }
                //空行
                System.out.println();
            }
        }
    

    接下来,上结果图~~~

    结果图

    可以联系博主哟~~
    邮箱:ycountjavaxuan@outlook.com

  • 相关阅读:
    查询反模式
    查询反模式
    查询反模式
    查询反模式
    linux vi(vim)常用命令汇总(转)
    面试笔试题之二叉树经典25题
    查找至少一个重复元素
    海盗分金问题
    Output of C++ Program | Set 18
    Output of C++ Program | Set 17
  • 原文地址:https://www.cnblogs.com/tdg-yyx/p/6823081.html
Copyright © 2020-2023  润新知