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

相关内容

热门资讯

安卓系统emoji表情很少,探... 你知道吗?在手机世界里,emoji表情可是沟通的利器,它能让我们的聊天更加生动有趣。但是,你知道吗?...
安卓系统的德州游戏,刺激竞技体... 你有没有发现,安卓手机上的游戏世界越来越精彩了?尤其是那些德州游戏,简直让人停不下来!今天,就让我带...
xbox360安卓系统,探索跨... 你有没有想过,家里的老Xbox 360竟然也能变身成为安卓系统的超级玩家呢?没错,就是那个曾经陪伴我...
安卓系统怎么找云端,而是通过安... 你有没有想过,你的安卓手机里那些珍贵的照片、文件和笔记,其实都可以存放在云端,随时随地都能访问呢?没...
安卓手机系统更原装,深度解析原... 你有没有发现,用安卓手机的时候,有时候感觉系统就像是你从小到大最熟悉的那件衣服,穿在身上,舒服又自在...
安卓系统8怎样退回,安卓8.0... 你有没有遇到过这种情况:手机更新了安卓系统8,结果发现新系统里的某些功能让你觉得不适应,或者某些操作...
安卓系统好用的语音,智能生活新... 你有没有发现,现在手机里的语音助手越来越聪明了?尤其是安卓系统的语音功能,简直让人爱不释手!今天,就...
安卓系统应用禁用服务 你有没有发现,手机里的安卓系统应用有时候会偷偷地开启一些后台服务,这可真是让人头疼啊!今天,就让我来...
安卓拨打系统电话调用,轻松实现... 你有没有想过,当你手机里突然弹出一个电话,而你又恰好想打给某人时,安卓系统是怎么帮你完成这个神奇过程...
安卓系统转ios推荐,轻松过渡... 你是不是也和我一样,对手机系统有着浓厚的兴趣呢?最近,我发现了一个有趣的现象:越来越多的朋友从安卓系...
安卓系统ping ip地址,A... 你有没有想过,当你打开手机,输入一个IP地址,然后神奇地发现,你的安卓系统能够像魔法一样告诉你那个地...
安卓系统更新了没有,安卓系统最... 最近你的安卓手机是不是也跟着时代潮流,迫不及待地想要更新一下系统呢?别急,让我来给你详细扒一扒,看看...
锤子如何升级安卓系统,轻松迈向... 亲爱的手机控们,你是不是也和我一样,对锤子手机的那颗“坚果”心念念不忘呢?不过,你知道吗?为了让你的...
安卓系统和linux系统互通吗... 你有没有想过,安卓系统和Linux系统之间是不是能来个亲密接触呢?想象你的安卓手机和Linux电脑无...
安卓系统升级作用,提升系统性能... 你知道吗?每次你的安卓手机更新系统,就像是给它来了一次全面的“SPA”护理,不仅让它焕然一新,还能让...
安卓系统手写连写设置,个性化设... 你有没有发现,用安卓手机写东西的时候,手写输入有时候超级方便呢?尤其是当你想要快速记录一些灵感或者笔...
小米手机的安卓系统,深度解析安... 你有没有发现,最近小米手机的安卓系统好像变得特别不一样了?没错,今天咱们就来聊聊这个话题,看看小米手...
电视安卓系统文件快传,快传功能... 亲爱的读者们,你是否曾在使用电视时,因为传输文件而感到烦恼?别担心,今天我要给你带来一个超级实用的技...
安卓系统下载盒精灵,安卓系统下... 你有没有想过,家里的电视也能变得像智能手机一样智能呢?没错,这就是安卓系统下载盒精灵的魅力所在。今天...
安卓系统编写应用,打造个性化移... 你有没有想过,手机里那些让你爱不释手的APP,其实都是用安卓系统编写出来的呢?没错,就是那个让我们的...