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按照这样的规律存进数组便是解体的关键(其实跟没说一样,知道这种规律直接打印好了)

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

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

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

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

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

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

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

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

1 /*计数器*/ 2 private static int count = 0; 3 /**/ 4 private static int i = 0; 5 /*控制台接收输入参数*/ 6 private static Scanner input = new Scanner(System.in); 7 8 //程序入口 9 public static void main(String[] args) { 10 System.out.println("请输入两个数作为行列"); 11 int m = input.nextInt(); 12 int n = input.nextInt(); 13 /*初始化一个m行n列的二维数组*/ 14 int[][] array = new int[m][n]; 15 /*初始值设为1*/ 16 int num = 1; 17 count = m / 2; 18 if (m % 2 != 0) { 19 count++; 20 } 21 int sum = m * n ; 22 //对元素进行排序 23 array = getNums(array, m, n, num,sum); 24 //打印数组元素 25 printArray(array, m, n); 26 input.close(); 27 } 28 29 /** 30 * 根据输入行列值初始化数据 31 * 32 * @param array 空数组 33 * @param m34 * @param n35 * @param num 数据从1开始 36 * @return 赋值后数组 37 */ 38 private static int[][] getNums(int[][] array, int m, int n, int num,int sum) { 39 //遍历行 40 for (int j = i; j < n; j++) { 41 array[i][j] = num; 42 num++; 43 if (num > sum) { 44 return array; 45 } 46 } 47 //固定列,四边形最右边的数据 48 for (int j = i + 1; j < m; j++) { 49 array[j][n - 1] = num; 50 num++; 51 if (num > sum) { 52 return array; 53 } 54 } 55 //固定行,四边形最下面的数据 56 for (int j = n - 2; j > i; j--) { 57 array[m - 1][j] = num; 58 num++; 59 if (num > sum) { 60 return array; 61 } 62 } 63 //固定列,四边形最左边一列的数据 64 for (int j = m - 1; j > i; j--) { 65 array[j][i] = num; 66 num++; 67 if (num > sum) { 68 return array; 69 } 70 } 71 n--; 72 m--; 73 i++; 74 if (i == count) { 75 return array; 76 } 77 return getNums(array, m, n, num,sum); 78 } 79 80 /** 81 * 输出数组中所有元素 82 * 83 * @param array 待输出数组 84 * @param m85 * @param n86 */ 87 private static void printArray(int[][] array, int m, int n) { 88 for (int i = 0; i < m; i++) { 89 for (int j = 0; j < n; j++) { 90 System.out.print(array[i][j] + "\t"); 91 } 92 //空行 93 System.out.println(); 94 } 95 }

接下来,上结果图~~~

结果图

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

CoreJava逻辑思维 - HelloWorld