矩阵打印问题
创始人
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);}
}

相关内容

热门资讯

手机装虚拟安卓系统教程,手机安... 你有没有想过,你的手机可以变成一个多才多艺的小戏精,既能装Windows,又能玩安卓?没错,这就是今...
安卓系统平板电脑屏幕暗,打造舒... 你是不是也遇到了这样的烦恼?你的安卓系统平板电脑屏幕突然暗了下来,亮度调节按钮也似乎失灵了。别急,让...
安卓高清系统推荐电脑版,打造极... 你有没有想过,手机上的安卓高清系统竟然也能搬到电脑上?没错,就是那种流畅、美观,还能让你在电脑上也能...
自己刷安卓盒子系统,功能、操作... 你有没有想过,家里的安卓盒子系统是不是该来个焕然一新的大变身呢?别急,让我带你一步步走进自己刷安卓盒...
安卓系统的空格怎么输入,探索安... 你是不是也和我一样,在使用安卓手机的时候,有时候会遇到一个让人头疼的问题——怎么输入空格呢?别急,今...
安卓系统如何删除僵尸粉 你是不是也遇到了这样的烦恼?手机里安卓系统的社交软件里,突然冒出了好多僵尸粉,这些家伙不仅不互动,还...
安卓平板电脑能刷系统,解锁无限... 你有没有想过,你的安卓平板电脑是不是也能来个“变身大法”,换换新系统呢?没错,今天就要来聊聊这个话题...
安卓双系统机器人,探索安卓双系... 你知道吗?在科技飞速发展的今天,手机已经不仅仅是一个通讯工具了,它还能变成一个多才多艺的小助手。最近...
ubuntu安装安卓系统下载,... 哇,你有没有想过,在你的Ubuntu电脑上安装一个安卓系统呢?想象你可以在同一个设备上无缝切换使用W...
安卓怎么进入闪氪系统,操作指南... 你有没有想过,你的安卓手机里隐藏着一个神秘的闪氪系统?别惊讶,这可不是科幻小说里的情节,而是真实存在...
如何关掉安卓系统通知,享受宁静 手机通知这东西,有时候真是让人又爱又恨。你有没有遇到过这种情况:手机里弹出来的通知一个接一个,让你分...
安卓系统为啥不更新了,安卓系统... 你有没有发现,最近你的安卓手机好像有点儿“懒”了,更新系统的时候总是慢吞吞的,甚至有时候直接告诉你:...
安卓系统手电在哪里打开,安卓手... 你有没有在安卓手机上找过手电筒功能,结果却像在茫茫大海中捞针一样?别急,今天就来给你详细揭秘,安卓系...
安卓系统个版本通用吗 你有没有想过,你的安卓手机上的系统版本是不是和别人的手机一样通用呢?这个问题听起来可能有点奇怪,但确...
安卓玩鸿蒙系统好吗,安卓用户玩... 你有没有想过,把安卓手机换成鸿蒙系统,会是怎样的体验呢?最近,这个话题在互联网上可是掀起了一阵热潮。...
安卓开源报名系统源码,架构设计... 你有没有想过,那些在手机上报名参加各种活动、课程或者考试的安卓应用,其实背后有一个神秘的“大脑”——...
峰米系统是安卓系统吗,揭秘安卓... 你有没有听说过峰米系统?最近这个话题在数码圈里可是挺火的。很多人都在问,峰米系统是安卓系统吗?今天,...
华为系统emui和安卓系统的区... 你有没有发现,手机的世界里,系统就像是它们的灵魂,决定了它们能跳得多高、飞得多远。今天,咱们就来聊聊...
朗逸安卓系统车载导航,安卓系统... 你有没有想过,开车的时候,导航系统就像是个贴心的导航小精灵,带你穿梭在城市的每一个角落?今天,就让我...
排球鹰眼系统辅助器安卓,安卓排... 你有没有想过,在观看排球比赛时,那些精准的鹰眼系统是如何让比赛画面更加清晰、精彩呢?现在,就让我带你...