矩阵打印问题
创始人
2024-05-30 04:43:32
0

文章目录

  • 1、题目一:正方形矩阵顺时针转动90度
    • 1.1 题目描述
    • 1.2 思路分析
    • 1.3 代码实现
  • 2、题目二:转圈打印长方形矩阵
    • 2.1 题目描述
    • 2.2 思路分析
    • 2.3 代码实现
  • 3、题目三:zigzag打印矩阵
    • 3.1 题目描述
    • 3.2 思路分析
    • 3.3 代码实现
  • 4、题目四:输出初始边长为 N 的图案
    • 4.1 题目描述
    • 4.2 思路分析
    • 4.3 代码实现

1、题目一:正方形矩阵顺时针转动90度

1.1 题目描述

给定一个正方形矩阵 matrix原地 调整成顺时针90度转动的样子
正方形矩阵原地旋转90度

1.2 思路分析

题目解读,就是矩阵根据中心点,每个位置顺时针旋转90度,即如图:
请添加图片描述
注意,题目要求的是在不申请辅助数组的情况下,原地调整。

题目给定的一定是正方形,因为所使用的内存地址是不会变的。

本题涉及到一个重要的知识点——矩阵的分圈结构

矩阵的左上角和右下角坐标可以确定矩阵的一圈,而这一圈中的数旋转依然还是在这一圈中。一圈中的数旋转完成后,将左上角和右下角坐标均往里层变化,直到两个坐标发生了错位就表示旋转完成。

请添加图片描述
那么一圈中的数怎么调整呢?使用分组。

请添加图片描述
如果整个矩阵的左上角坐标是 (a,b)(a, b)(a,b),右下角坐标是 (c,d)(c, d)(c,d),那么第 iii 组的第一个的坐标是 (a,b+i)(a, b+i)(a,b+i),第二个的坐标是(a+i,d)(a+i, d)(a+i,d), 第三个的坐标是 (c,d−i)(c, d-i)(c,d−i),第四个坐标是 (c−i,b)(c-i, b)(c−i,b)。

启发:矩阵的分圈结构。

1.3 代码实现

public class RotateMatrix {public static void rotate(int[][] matrix) {int a = 0;int b = 0;int c = matrix.length - 1;int d = matrix[0].length - 1;while (a < c) {rotateEdge(matrix, a++, b++, c--, d--); //圈中调整,调整完成后左上角和右下角坐标往中间变化}}public static void rotateEdge(int[][] m, int a, int b, int c, int d) {int tmp = 0;//圈中的每组的四个位置互相变换for (int i = 0; i < d - b; i++) { //d-b就是组号,表示一共有多少组tmp = m[a][b + i];m[a][b + i] = m[c - i][b];m[c - i][b] = m[c][d - i];m[c][d - i] = m[a + i][d];m[a + i][d] = tmp;}}public static void printMatrix(int[][] matrix) {for (int i = 0; i != matrix.length; i++) {for (int j = 0; j != matrix[0].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println();}}public static void main(String[] args) {int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };printMatrix(matrix);rotate(matrix);System.out.println("=========");printMatrix(matrix);}
}

2、题目二:转圈打印长方形矩阵

2.1 题目描述

给定一个长方形矩阵matrix,实现转圈打印

a  b  c  d
e  f  g  h
i  j  k  L

打印顺序:a b c d h L k j i e f g

2.2 思路分析

依然是分圈

请添加图片描述

2.3 代码实现

先列举具体的数据量然后再抽象化。

public class PrintMatrixSpiralOrder {public static void spiralOrderPrint(int[][] matrix) {int tR = 0;int tC = 0;int dR = matrix.length - 1;int dC = matrix[0].length - 1;while (tR <= dR && tC <= dC) {printEdge(matrix, tR++, tC++, dR--, dC--);}}public static void printEdge(int[][] m, int tR, int tC, int dR, int dC) {if (tR == dR) {for (int i = tC; i <= dC; i++) {System.out.print(m[tR][i] + " ");}} else if (tC == dC) {for (int i = tR; i <= dR; i++) {System.out.print(m[i][tC] + " ");}} else {int curC = tC;int curR = tR;while (curC != dC) {System.out.print(m[tR][curC] + " ");curC++;}while (curR != dR) {System.out.print(m[curR][dC] + " ");curR++;}while (curC != tC) {System.out.print(m[dR][curC] + " ");curC--;}while (curR != tR) {System.out.print(m[curR][tC] + " ");curR--;}}}public static void main(String[] args) {int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 },{ 13, 14, 15, 16 } };spiralOrderPrint(matrix);}
}

3、题目三:zigzag打印矩阵

3.1 题目描述

给定一个正方形或者长方形矩阵 matrix,实现zigzag打印

0 1 2
3 4 5
6 7 8 

打印: 0 1 3 6 4 2 5 7 8

3.2 思路分析

在这里插入图片描述
跳出局部,看宏观。

两个点A和B,一开始这两个点都是指的矩阵左上角的点,规定 A 一直往右走,不能再往右的时候往下;而规定B一直往下走,不能再往下的时候往右走。A每走一步,B也要相应地走一步,二者连线是条斜线,将这条斜线打印出来即可。

在这里插入图片描述
再写一个斜线打印的方程,其中包含从下往上打印和从上向下打印,使用布尔值区分打印方向。

3.3 代码实现

public class ZigZagPrintMatrix {public static void printMatrixZigZag(int[][] matrix) {int tR = 0;int tC = 0;int dR = 0;int dC = 0;int endR = matrix.length - 1;int endC = matrix[0].length - 1;boolean fromUp = false;while (tR != endR + 1) {printLevel(matrix, tR, tC, dR, dC, fromUp);tR = tC == endC ? tR + 1 : tR;tC = tC == endC ? tC : tC + 1;dC = dR == endR ? dC + 1 : dC;dR = dR == endR ? dR : dR + 1;fromUp = !fromUp;}System.out.println();}//打印斜线public static void printLevel(int[][] m, int tR, int tC, int dR, int dC, boolean f) {if (f) {while (tR != dR + 1) {System.out.print(m[tR++][tC--] + " "); //从上往下方向}} else {while (dR != tR - 1) {System.out.print(m[dR--][dC++] + " "); //从下往上方向}}}public static void main(String[] args) {int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };printMatrixZigZag(matrix);}
}

4、题目四:输出初始边长为 N 的图案

4.1 题目描述

给定一个 n∗nn*nn∗n 的矩阵,在其中按照如下规则填 *

例1:n=3n=3n=3
在这里插入图片描述
例2:n=4n=4n=4
在这里插入图片描述
例3:n=5n=5n=5
在这里插入图片描述
例4:n=10n=10n=10
在这里插入图片描述

4.2 思路分析

也就是无论往哪个方向填,每个方向都要留个空格避免与之前的 * 碰到。

依然是分圈,但是是两层一个圈,当前这个圈打印完后,左上角往右下角跳两层、右下角往左上角跳两层来到第二个圈。搞定每圈的打印,整个图案就可以打印完成。
在这里插入图片描述

4.3 代码实现

public class PrintStar {public static void printStar(int N) {int leftUp = 0;int rightDown = N - 1;char[][] m = new char[N][N];for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {m[i][j] = ' ';}}while (leftUp <= rightDown) {set(m, leftUp, rightDown);leftUp += 2;rightDown -= 2;}for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {System.out.print(m[i][j] + " ");}System.out.println();}}public static void set(char[][] m, int leftUp, int rightDown) {for (int col = leftUp; col <= rightDown; col++) {m[leftUp][col] = '*';}for (int row = leftUp + 1; row <= rightDown; row++) {m[row][rightDown] = '*';}for (int col = rightDown - 1; col > leftUp; col--) {m[rightDown][col] = '*';}for (int row = rightDown - 1; row > leftUp + 1; row--) {m[row][leftUp + 1] = '*';}}public static void main(String[] args) {printStar(5);}
}

相关内容

热门资讯

定制系统数据安卓转苹果,体验跨... 你有没有想过,手机从安卓转到苹果,这中间的数据迁移,是不是就像搬家一样,既繁琐又让人头疼?别急,今天...
iphone怎么刷安卓双系统 你有没有想过,你的iPhone也能变身成为安卓双系统的小能手呢?没错,就是那个我们平时用来打电话、刷...
安卓系统网络拦截怎么设置,轻松... 你有没有遇到过这种情况:在使用安卓手机时,突然弹出一个广告,让你忍不住想关掉它?或者有时候,一些不安...
苹果系统和安卓系统的区别ppt... 你有没有想过,为什么你的手机里装的是苹果系统而不是安卓系统呢?是不是好奇它们之间有什么不一样的地方?...
安卓系统隐藏运行程序 你知道吗?手机里那些看似安静的小程序,其实可能正在偷偷地运行着呢!是不是觉得有点不可思议?别急,让我...
安卓设置系统简体与繁体,探索安... 亲爱的手机控们,你是否在某个瞬间,突然对手机上的文字产生了好奇,想要知道如何轻松切换安卓系统中的简体...
平凉综合办公系统安卓,便捷高效... 你有没有听说过那个超级方便的平凉综合办公系统安卓版?没错,就是那个能让你的工作生活变得更加轻松的神奇...
安卓系统的实验报告,深入剖析与... 你知道吗?最近我在手机上做了一场有趣的实验,就是测试安卓系统的性能。这可不是随便玩玩,而是真的深入研...
oppo安卓9系统如何,功能亮... 你有没有发现,你的OPPO手机最近是不是有点儿不一样了?是不是觉得它变得更加聪明、更加流畅了呢?哈哈...
苹果装安卓系统卡吗 你有没有想过,把苹果手机换成安卓系统,是不是就像换了个新世界?不过,听说有人担心,苹果装上安卓系统会...
rog安卓10系统键盘下面,键... 亲爱的读者,你是否曾在使用安卓手机时,对那小小的键盘下面隐藏的神秘世界感到好奇?今天,就让我带你一探...
618推荐手机安卓系统 618购物节又要来了!是不是已经迫不及待想要换一部新手机了呢?别急,今天我就要给你推荐几款在安卓系统...
4寸手机安卓系统吗 你有没有想过,为什么现在的手机屏幕越来越小,却依然能塞进那么多的功能呢?今天,我们就来聊聊这个话题:...
安卓系统开启后台程序,高效管理... 你有没有发现,手机里的安卓系统越来越智能了?它就像一个贴心的管家,默默地在后台为你打理着各种事务。但...
战地1内存和安卓系统,战地1内... 你有没有发现,最近玩《战地1》的小伙伴们都在抱怨内存不够用?别急,让我来给你详细解析一下这个问题,顺...
电脑连接安卓系统手机,探索跨平... 你有没有想过,你的电脑和安卓手机之间也能来个亲密接触呢?没错,就是那种无缝连接的感觉,让你的手机屏幕...
安卓系统和ios系统玩吃鸡 你有没有发现,最近不管是大街小巷,还是线上线下的聚会,提到最多的游戏就是“吃鸡”啦!这款游戏可谓是风...
阻止安卓系统杀程序,如何有效阻... 你有没有遇到过这种情况?手机里装了好多喜欢的应用,可是一不小心,某个程序就被安卓系统无情地杀掉了。别...
国内安卓系统大小对比图,国内安... 你有没有想过,我们每天使用的安卓系统,其实就像是一个庞大的“城市”,里面住着各种各样的“居民”,而这...
苹果和安卓系统大小,系统规模对... 你有没有想过,为什么你的手机里装了那么多应用,可内存还是不够用呢?今天,就让我带你一探究竟,揭秘苹果...