CoreJava逻辑思维

Stella981
• 阅读 462

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] + "\t");
            }
            //空行
            System.out.println();
        }
    }

接下来,上结果图~~~

CoreJava逻辑思维

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Peter20 Peter20
3年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这