数据结构基础之《(19)—矩阵处理》

news2025/3/9 8:35:14

一、zigzag打印矩阵

Z字形打印矩阵
 1  2  3  4  5  6
 7  8  9  10 11 12
 13 14 15 16 17 18
打印顺序:1,2,7,13,8,3,4,9,14...

核心技巧:找到coding上的宏观调度

左上角有A、B两个点,A往右一步一步走,B往下一步一步走
写一个函数从左下往右上打印,调度问题交给点A和B来移动

package class09;

/**
 * Z字形打印矩阵
 */
public class Code06_ZigZagPrintMatrix {

	public static void printMatrixZigZag(int[][] matrix) {
		int aR = 0; //A的行号
		int aC = 0; //A的列号
		int bR = 0; //B的行号
		int bC = 0; //B的列号
		int endR = matrix.length - 1; //最后的行号
		int endC = matrix[0].length - 1; //最后的列号
		boolean fromUp = false; //是不是从右上往左下打印
		while (aR != endR + 1) { //A的行号,不等于最后的行号+1,A到了终点
			printLevel(matrix, aR, aC, bR, bC, fromUp);
			aR = (aC == endC ? aR + 1 : aR); //A的列数到最后一列,A的行号才加1
			aC = (aC == endC ? aC : aC + 1); //A的列数到最后一列,A的列数不变,否则A的列数加1
			bC = (bR == endR ? bC + 1 : bC); //B的行数到最后一行,B的列数加1,否则B的列数不变
			bR = (bR == endR ? bR : bR + 1); //B的行数到最后一行,B的行数不变,否则B的行数加1
			fromUp = !fromUp; //打印方向
		}
		System.out.println();
	}
	
	/**
	 * 告诉你斜线的两端是A和B,方向也告诉你,就可以打印了
	 * @param m
	 * @param tR
	 * @param tC
	 * @param dR
	 * @param dC
	 * @param f
	 */
	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},
				{13,14,15,16}
		};
		printMatrixZigZag(matrix);
	}
}

打印结果:

1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16 

二、转圈打印矩阵

按照层考虑:

第一层的结束的位置和第二层开始的位置挨着,第二层结束的位置和第三层开始的位置挨着。。。

思路:
获取四个角的点,打印时判断位置是否到四个角

package class09;

/**
 * 回形打印矩阵
 */
public class Code05_PrintMatrixSpiralOrder {

	public static void sprialOrderPrint(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--); //左上角点往右下方移动,右下角点往左上方移动
		}
	}
	
	/**
	 * 
	 * @param m
	 * @param tR 左上角点的行号
	 * @param tC 左上角点的列号
	 * @param dR 右下角点的行号
	 * @param 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}
		};
		sprialOrderPrint(matrix);
	}
}

打印结果:

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 

三、原地旋转正方形矩阵

package class09;

/**
 * 原地旋转正方形矩阵
 */
public class Code04_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--);
		}
	}
	
	/**
	 * 一个圈里面怎么转
	 * @param m
	 * @param a
	 * @param b
	 * @param c
	 * @param 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++) {
			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);
		System.out.println("====================");
		rotate(matrix);
		printMatrix(matrix);
	}
}

打印结果:

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
====================
13 9 5 1 
14 10 6 2 
15 11 7 3 
16 12 8 4 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

nuxt2 打包优化使用“compression-webpack-plugin”插件

在使用 Nuxt.js 构建项目时&#xff0c;为了提高性能&#xff0c;通常会考虑对静态资源进行压缩。compression-webpack-plugin 是一个常用的 Webpack 插件&#xff0c;用于在生产环境中对文件进行 Gzip 压缩。这对于减少网络传输时间和提高页面加载速度非常有帮助。下面是如何在…

ArcGIS Pro:轻松制作地震动画,洞察灾害动态

在当今的信息展示领域&#xff0c;动画因其直观、生动的特点&#xff0c;逐渐成为各类汇报、研究展示中的重要元素。 尤其是在地理信息领域&#xff0c;通过动画来展示动态的地理现象&#xff0c;能够让观众更清晰地理解数据背后所蕴含的信息。 地震作为一种突发性的自然灾害…

MAVEN手动配置(阿里云)全教程

介于网上各种各样的MAVEN配置过程中方法大致相同却细节参差不齐&#xff0c;我总结了我遇见的一些问题&#xff0c;来完全的解决MAVEN手动配置的全过程&#xff0c;以及分享解决小毛病的经验。 所需材料&#xff1a; MAVEN3.9.9&#xff08;下载适合自己的版本即可&#xff09…

贪心算法一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…

计算机毕业设计Python+DeepSeek-R1大模型微博的话题博文及用户画像分析系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Secret Cow Code S

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 既然选择了远方,当不负青春,砥砺前行! 题目描述 奶牛们正在实验秘密代码,并设计了一种方法用于生成无限长度的字符…

MyBatis - XML CRUD 其他查询

1. XML 配置文件 使用 MyBatis 操作数据库的方式有两种: 注解 (在注解中定义 SQL 语句)XML 配置文件 (在 XML 文件中定义 SQL 语句) 在上一篇博客中, 已经讲解了如何使用注解操作数据库, 本篇文章来讲解如何使用 XML 进行 MyBatis 开发. 使用 XML 的步骤, 和使用注解的步骤…

牛客python蓝桥杯11-32(自用)

11 import os import sysdef huiwen(str):length len(str)# if length 0:# return -1result []for i in range(length-1): # 0 - length-2for j in range(i2,length1):# 取出从索引 i 到 j-1 的子串s str[i:j]# 正序倒序if s s[::-1]:result.append(len(s))if result…

rabbitmq版本升级并部署高可用

RabbitMQ版本升级 先检查是否已经安装rabbitmq rpm -qa|grep rabbitmq|wc -l //如果结果是0&#xff0c;表示没有安装 rpm -e --nodeps $(rpm -qa|grep rabbitmq) //如安装了&#xff0c;则进行卸载 先检查是否已经安装erlang rpm -qa|grep erlang|wc -l //如果结果…

数据集路径出错.yaml‘ images not found , missing path

方法一&#xff1a;删除settings.yaml 方法二&#xff1a;dataset_name.yaml改用绝对路径&#xff0c;如最后一张图 错误分析&#xff1a; dataset_name.yaml中的path的路径仅支持绝对路径&#xff0c;写相对路径就会搜索不到&#xff0c;使用settings.json中的路径&#xff0…

win32汇编环境,对话框中使用树形视图示例二

;运行效果 ;win32汇编环境,对话框中使用树形视图示例二 ;得到树形视图控件Treeview的全路径字符串,这里的方法是由子项向父项挨个找的算法找齐路径 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>&g…

【连珠云弈】网页五子棋版项目测试报告

目录 一、项目背景 1.1、项目起源 1.2、市场需求 1.3、项目目标 二、项目功能 2.1 用户管理功能 2.2 游戏对战功能 三、测试报告 3.1.功能测试 ​编辑 3.1.1注册功能测试 解决bug&#xff1a; 测试总结&#xff1a; 3.1.2登录功能测试 测试总结&#xff1a; 3.…

OpenCV计算摄影学(15)无缝克隆(Seamless Cloning)调整图像颜色的函数colorChange()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::colorChange 是 OpenCV 中用于调整图像颜色的函数。它允许你通过乘以不同的系数来独立地改变输入图像中红色、绿色和蓝色通道的强度&#xf…

AI视频领域的DeepSeek—阿里万相2.1图生视频

让我们一同深入探索万相 2.1 &#xff0c;本文不仅介绍其文生图和文生视频的使用秘籍&#xff0c;还将手把手教你如何利用它实现图生视频。 如下为生成的视频效果&#xff08;我录制的GIF动图&#xff09; 如下为输入的图片 目录 1.阿里巴巴全面开源旗下视频生成模型万相2.1模…

用Python分割并高效处理PDF大文件

在处理大型PDF文件时&#xff0c;将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区&#xff0c;它可以提高处理效率&#xff0c;并使分析或操作文档变得更容易。在本文中&#xff0c;我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…

RabbitMQ知识点

1.为什么需要消息队列&#xff1f; RabbitMQ体系结构 操作001&#xff1a;RabbitMQ安装 二、安装 # 拉取镜像 docker pull rabbitmq:3.13-management ​ # -d 参数&#xff1a;后台运行 Docker 容器 # --name 参数&#xff1a;设置容器名称 # -p 参数&#xff1a;映射端口号&…

2025-03-06 学习记录--C/C++-PTA 习题6-6 使用函数输出一个整数的逆序数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>int reverse( int number );int main…

力扣132. 分割回文串 II

力扣132. 分割回文串 II 题目 题目解析及思路 题目要求返回将s切割成若干回文串的最少切割次数 对于子串s[j...i]&#xff0c;若为回文串&#xff0c;则问题变为求s[0...j]的最少切割次数 因此可以考虑动态规划 对于问题s[j...i]是否为回文串&#xff0c;若s[i] s[j]则问…

调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)

文章目录 调研&#xff1a;如何实现智能分析助手&#xff08;Agent&#xff09;&#xff08;AutoCoder、FastGPT、AutoGen、DataCopilot&#xff09;一、交互流程二、数据流程三、架构分类四、开源产品4.1 AutoCoder&#xff08;知识库变体&#xff09;4.2 FastGPT&#xff08;…