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

相关内容

热门资讯

122.(leaflet篇)l... 听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
Vue使用pdf-lib为文件... 之前也写过两篇预览pdf的,但是没有加水印,这是链接:Vu...
PyQt5数据库开发1 4.1... 文章目录 前言 步骤/方法 1 使用windows身份登录 2 启用混合登录模式 3 允许远程连接服...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
Linux基础命令大全(上) ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维...
再谈解决“因为文件包含病毒或潜... 前面出了一篇博文专门来解决“因为文件包含病毒或潜在的垃圾软件”的问题,其中第二种方法有...
南京邮电大学通达学院2023c... 题目展示 一.问题描述 实验题目1 定义一个学生类,其中包括如下内容: (1)私有数据成员 ①年龄 ...
PageObject 六大原则 PageObject六大原则: 1.封装服务的方法 2.不要暴露页面的细节 3.通过r...
【Linux网络编程】01:S... Socket多进程 OVERVIEWSocket多进程1.Server2.Client3.bug&...
数据结构刷题(二十五):122... 1.122. 买卖股票的最佳时机 II思路:贪心。把利润分解为每天为单位的维度,然后收...
浏览器事件循环 事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间࿰...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
计算机二级Python备考(2... 目录  一、选择题 1.在Python语言中: 2.知识点 二、基本操作题 1. j...
端电压 相电压 线电压 记得刚接触矢量控制的时候,拿到板子,就赶紧去测各种波形,结...
如何使用Python检测和识别... 车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计...
带环链表详解 目录 一、什么是环形链表 二、判断是否为环形链表 2.1 具体题目 2.2 具体思路 2.3 思路的...
【C语言进阶:刨根究底字符串函... 本节重点内容: 深入理解strcpy函数的使用学会strcpy函数的模拟实现⚡strc...
Django web开发(一)... 文章目录前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和s...