矩阵特殊打印方式

  小伙伴们大家好,好几天没更新了,主要有个比赛。从今天起继续给大家更新,今天给大家带来一种新的题型:矩阵特殊打印方式。

螺旋打印矩阵

解题思路

  首先给大家看一下什么是螺旋方式打印:

  就像这样一直转圈圈。

  我想大多数小伙们们看到这道题目,肯定会考虑打印时,什么情况往下走,什么时候往左走,什么时候往右走,什么时候往上走,以及走到哪。当然,这种方法可以作出此题目,但太麻烦了,且耗费时间长。

  这里我给出大家一种好办法:

  开始时标记矩阵左上角和右下角,将外圈打印完(第一行,第5列,第3行,第1列)。然后将左上角位置横纵坐标均加一,右下角横纵坐标均减一。再次打印新的外圈。直到左上角和右下角错位代表均打印完毕。

代码分析

#include<iostream>
using namespace std;
int arr[10][10];
void printinfo(int startx,int starty,int endx,int endy){//同行 if(startx==endx){for(int i=starty;i<=endy;i++){cout<<arr[startx][i]<<" ";}return;}//同列if(starty==endy){for(int i=startx;i<=endx;i++){cout<<arr[i][starty]<<" ";}return;} //一般情况 for(int i=starty;i<=endy;i++){cout<<arr[startx][i]<<" ";} for(int i=startx+1;i<=endx;i++){cout<<arr[i][endy]<<" ";} for(int i=endy-1;i>=starty;i--){cout<<arr[endx][i]<<" ";} for(int i=endx-1;i>=startx+1;i--){cout<<arr[i][starty]<<" ";} 
}
int main(){int n,m;cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>arr[i][j];}}int startx=0,starty=0,endx=n-1,endy=m-1;while(startx<=endx&&starty<=endy){printinfo(startx,starty,endx,endy);startx++;starty++;endx--;endy--;}
}

  大家要注意左上角元素和右下角元素可能处于同行或者同列。打印时注意不要重复打印!!

正方形顺时针旋转90度后打印 

解题思路

  这道题目我想大家都知道什么意思,就是将矩阵往右翻个再打印。

  翻转后,1号元素来到3号元素位置。2号元素来到6号元素位置。3号元素来到9号元素位置......

如果我们将正方形分为两组,分别是:1、3、9、7     2、6、8、4。我们每一次循环对每一组的位置进行交换,那么当我们完成对每一组的交换后,最外圈就旋转了90度!!此时我们再将左上角和右下角分别向右下和坐上移动,让新的外圈选择90度,当左上角位置和右上角位置重合时,即代表结束。

  我们考虑一般情况:正方形规模为n*n,那么我们需要分为n-1组(每一圈)。对于第i组(i从0开始编号),其左上角位置为(startx,starty),右下角位置为(endx,endy)。第一个元素其位置为arr【startx】【starty+i】,第二个元素位置为arr【startx+i】【endy】,第三个元素位置为arr【endx】【endy-i】,第四个元素位置为arr【endx-i】【starty】。对于每一组均交换四个位置元素值,完成每一圈。然后左上角和右下角位置分别往右下角和左上角移动,重复操作。知道startx>=endx(因为是正方形,横纵坐标相同)。

代码分析

#include<iostream>
using namespace std;
int arr[10][10]; 
void printinfo(int startx,int starty,int endx,int endy){//组别 int size=endy-starty;for(int i=0;i<size;i++){//第i组第一个   arr[startx][starty+i];//第i组第二个   arr[startx+i][endy];//第i组第三个   arr[endx][endy-i];//第i组第四个   arr[endx-i][starty] //交换四个位置元素即可int temp;temp=arr[startx][starty+i];arr[startx][starty+i]=arr[endx-i][starty];arr[endx-i][starty]=arr[endx][endy-i];arr[endx][endy-i]=arr[startx+i][endy];arr[startx+i][endy]=temp;}for(int i=0;i<4;i++){for(int j=0;j<4;j++){cout<<arr[i][j]<<" ";}cout<<endl;}cout<<endl;
}
int main(){int n,m;cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>arr[i][j];}}cout<<endl;int startx=0,starty=0,endx=n-1,endy=m-1;while(startx<endx){printinfo(startx,starty,endx,endy);startx++;starty++;endx--;endy--;}
}

zigzag打印矩阵 

解题思路

  打印方式如上图所示。这道题我们依然使用两个位置,初始时均位于左上角 。但某种次序打印位于二者之间的元素。然后一个位置往右走,一个位置往左走,再按相反的次序打印位于二者联系之间的元素。当向右走的位置无法向右走时就向下走,当向下走的位置无法向下走时就向右走。当两者无论如何怎么走都会越界时代表结束(此时二者均在右下角)。打印次序的确定我们可以使用标志变量确定。

代码分析

#include<iostream>
using namespace std;
int arr[10][10]; 
void printinfo(int a,int b,int c,int d,int flag){//左下往右上 int i,j;if(flag>0){i=a;j=b;while(i>=c&&j<=d){cout<<arr[i][j]<<" ";i--;j++;}}//右上向左下 else{i=c;j=d;while(i<=a&&j>=b){cout<<arr[i][j]<<" ";i++;j--;}}
}
int main(){int n,m;cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>arr[i][j];}}cout<<endl;int a,b,c,d;a=b=c=d=0;int flag=1;while(a<n&&b<m&&c<n&&d<m){printinfo(a,b,c,d,flag);if(a<n-1){a++;}else{b++;}if(d<m-1){d++;}else{c++;}flag=-flag;}
}

  本期代码分析结束,主要是告诉大家遇见特殊矩阵打印方式时,大家能够从整体分析,而步局限于局部。多多点赞支持一下吧!! 

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

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

相关文章

C语言 流程控制语句

时间&#xff1a;2024.11.5 一、学习内容 流程控制语句&#xff1a; 通过一些语句&#xff0c;控制程序的执行流程。 1、顺序结构 从上往下依次执行&#xff0c;是程序默认的执行过程。 2、if的第一种格式 if(关系表达式) { 语句体&#xff1b; } //考试奖励&#xff1a;…

03集合基础

目录 1.集合 Collection Map 常用集合 List 接口及其实现 Set 接口及其实现 Map 接口及其实现 Queue 接口及其实现 Deque 接口及其实现 Stack类 并发集合类 工具类 2.ArrayList 3.LinkedList 单向链表的实现 1. 节点类&#xff08;Node&#xff09; 2. 链表类&a…

HTMLCSS:3D 旋转卡片的炫酷动画

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁&#xff1f;我在那<…

网络自动化03:简单解释send_config_set方法并举例

目录 拓扑图设备信息 netmiko涉及方法send_config_set()方法的简单示例代码输出结果代码解释导入模块配置信息config_device_interface_description 函数主程序块总结 send_config_set方法参数&#xff1a;1. enter_config_mode2. config_commands3. enter_config_mode4. error…

什么是实验室信息(lis)系统?

医院LIS系统定义&#xff1a; 医院LIS系统&#xff0c;即实验室信息系统&#xff08;Laboratory Information System&#xff09;&#xff0c;是专为医院检验科设计的信息管理系统。它通过计算机网络技术实现实验仪器与计算机的联网&#xff0c;智能化、自动化地管理病人样品登…

MySQL45讲 第十六讲 “order by”是怎么工作的?

文章目录 MySQL45讲 第十六讲 “order by”是怎么工作的&#xff1f;一、引言二、全字段排序&#xff08;一&#xff09;索引创建与执行情况分析&#xff08;二&#xff09;执行流程&#xff08;三&#xff09;查看是否使用临时文件 三、rowid 排序&#xff08;一&#xff09;参…

网页版五子棋—— WebSocket 协议

目录 前言 一、背景介绍 二、原理解析 1.连接过程&#xff08;握手&#xff09; 2.报文格式 三、代码示例 1.服务端代码 &#xff08;1&#xff09;TestAPI 类 &#xff08;2&#xff09;WebSocketConfig 类 2.客户端代码 3.代码演示 结尾 前言 从本篇文章开始&am…

【综合案例】使用React编写B站评论案例

一、效果展示 默认效果&#xff0c;一开始默认按照最热进行排序 发布了一条评论 按照最新进行排序 按照最新进行排序 二、效果说明 页面上默认有3条评论&#xff0c;且一开始进入页面的时候是按照点赞数量进行倒序排列展示&#xff0c;可以点击【最热 、最新】进行排序的切换。…

docker镜像文件导出导入

1. 导出容器&#xff08;包含内部服务&#xff09;为镜像文件&#xff08;docker commit方法&#xff09; 原理&#xff1a;docker commit命令允许你将一个容器的当前状态保存为一个新的镜像。这个新镜像将包含容器内所有的文件系统更改&#xff0c;包括安装的软件、配置文件等…

区块链技术与应用-PKU 学习笔记

课程地址 资料&#xff1a; ETH-Security 区块链学习记录_比特币 BTC 密码学原理 比特币&#xff0c;又称加密货币(crypto-currency)&#xff0c;它主要利用了密码学中的哈希函数(cryptographic hash function)的抗碰撞特性(collision resistance)和单向散列特性(hiding) …

在Java中,实现数据库连接通常使用JDBC

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

【优选算法 — 双指针】双指针小专题

和为 s 的两个数 和为s的两个数 题目描述 解法一&#xff1a;暴力枚举 暴力枚举&#xff0c;先固定一个数&#xff0c;然后让这个数和另一个数匹配相加&#xff0c; 如果当前的数 所有剩余的数 target&#xff0c;则返回这两个数&#xff0c;否则固定下一个数&#…

并查集(基础学习与应用)

并查集 基本原理&#xff1a; 对于多个集合&#xff0c;每个集合中的多个元素用一颗树的形式表示&#xff0c;根节点的编号即为整个集合的编号&#xff0c;每个树上节点存储其父节点&#xff0c;使得当前集合的每个子节点都可以通过对父节点的询问来找到根节点&#xff0c;根…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

Spring Boot 与 Vue 共筑地方特色美食分享卓越平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

react使用Fullcalendar 实战用法

使用步骤请参考&#xff1a;react使用Fullcalendar 卡片式的日历&#xff1a; 需求图&#xff1a; 卡片式的日历&#xff0c;其实我是推荐 antd的&#xff0c;我两个都写了一下都能实现。 antd 的代码&#xff1a; antd的我直接用的官网示例&#xff1a;antd 日历示例 i…

Flutter 正在切换成 Monorepo 和支持 workspaces

其实关于 Monorepo 和 workspaces 相关内容在之前《Dart 3.5 发布&#xff0c;全新 Dart Roadmap Update》 和 《Flutter 之 ftcon24usa 大会&#xff0c;创始人分享 Flutter 十年发展史》 就有简单提到过&#xff0c;而目前来说刚好看到 flaux 这个新进展&#xff0c;所以就再…

在做题中学习(74):比较含退格的字符串

解法&#xff1a;用栈来模拟 思路&#xff1a;不用真的定义一个栈,用字符串string来模拟栈的行为 入栈&#xff1a;s[i] ! #时 push_back(s[i]) 出栈:s[i] # 的时候&#xff0c;并且s.size() > 0&#xff0c;pop_back(s[i])循环结束得到结果 注意&#xff1a;如果真的…

前后端交互通用排序策略

目录 排序场景 排序实现思路 1. 静态代码排序实现 2.数据库驱动排序实现 3. 基于Java反射的动态排序实现 通用排序工具 SortListUtil 结语 排序场景 在面向前端数据展示的应用场景中&#xff0c;我们旨在实现一个更加灵活的排序机制&#xff0c;该机制能够支持对从后端传递…

MD5(Crypto)

解题思路 打开文件发现一串代码&#xff0c;结合题目提示&#xff0c;应该是 MD5 加密。 找个在线的 MD5 解密网站&#xff0c;行云流水得到 flag。 题目设计原理 题目设计&#xff1a;无他&#xff0c;MD5 加密。 题目原理&#xff1a; MD5&#xff08;Message-Digest Algo…