C++打印之字形矩阵
打印之字形矩阵
1. 题目描述
给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12“之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12额外空间复杂度为O(1)O(1)O(1).
2. 解题思路
这题如果扣下标的关系的话将很难写,会陷入局部关系.但是我们从整体出发思路就会开阔很多.和前面的类似,本题采用的方法也是化整为零.
上坐标(tR,tC)的初始为(0,0),先沿着矩阵的第一行移动(tC++),当达到第一行最右边的元素后,再沿着矩阵最后一列移动 (tR++)。
下坐标(dR,dC)的初始为(0,0),先沿着矩阵的第一列移动(dR++),当到达第一列最下边的元素时,再沿着矩阵的最后一行一定(dC++)。
上坐标与下坐标同步移动,每次移动后的上坐标与下坐标的连线就是矩阵中的一条斜线,打印斜线上的元素即可。
如果上次斜线是从左下向右上打印的,这次一定是从右上向左下打印,反之亦然。总之,可以把打印的方向用bool变量表示,每次取反即可。
3. c++代码
#include <iostream>
#include <vector>template<typename T>
void printLevel(std::vector<std::vector<T>>& my_matrix,int tR, int tC, int dR, int dC, bool updown) {if (updown) {while (tR != dR + 1) {std::cout << my_matrix[tR++][tC--] << ",";}} else {while (dR != tR - 1) {std::cout << my_matrix[dR--][dC++] << ",";}}
}template<typename T>
void printMatrixZigZag(std::vector<std::vector<T>>& my_matrix) {int tR = 0;int tC = 0;int dR = 0;int dC = 0;bool updown = false;int endR = my_matrix.size() - 1;int endC = my_matrix[0].size() - 1;while (tR != endR + 1) {printLevel(my_matrix, tR, tC, dR, dC, updown);tR = tC == endC ? tR + 1 : tR;tC = tC == endC ? tC : tC + 1;dC = dR == endR ? dC + 1 : dC;dR = dR == endR ? dR : dR + 1; // attention hereupdown = !updown;}std::cout << "\n";}template<typename T>
void printMatrix(std::vector<std::vector<T>>& my_matrix) {for (int i = 0; i < my_matrix.size(); ++i) {for (int j = 0; j < my_matrix[0].size(); ++j) {std::cout << my_matrix[i][j] << ",";}}
}
int main() {std::vector<std::vector<int>> my_matrix = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10,11,12}};std::cout << "origin matrix is:" << std::endl;printMatrix(my_matrix);std::cout << "\n";std::cout << "zigzig matrix is:" << std::endl;printMatrixZigZag(my_matrix);return 0;
}
4. 一点注意
这里我们在写主函数4个点的更新代码的时候需要注意前后顺序, 原始代码:
tR = tC == endC ? tR + 1 : tR;tC = tC == endC ? tC : tC + 1;dC = dR == endR ? dC + 1 : dC;dR = dR == endR ? dR : dR + 1; // attention here
一开始我把第三行和第四行,写反了,即写成:
tR = tC == endC ? tR + 1 : tR;tC = tC == endC ? tC : tC + 1;dR = dR == endR ? dR : dR + 1; // attention heredC = dR == endR ? dC + 1 : dC;
然后程序死活得不到正确结果,因为感觉思路也是对的,为什么不能得到正确结果了.然后我们就进行了debug操作.
从debug操作我们知道,在程序进行跑到第三轮的时候,代码第三行其实dR被更新了,从而导致第四行的条件判断已经到边界了,所以此时dC变成了1,但实际上我们需要此时dC=0才对.因此第3,4行代码是不可交换的.
5. 参考文献
- [算法]“之”字形打印矩阵
- C++ 打印之字形矩阵
debug是个好东西,mark!
C++打印之字形矩阵相关推荐
- C++以螺旋方式打印m * n矩阵的算法(附完整源码)
C++以螺旋方式打印m * n矩阵的算法 C++以螺旋方式打印m * n矩阵的算法完整源码(定义,实现,main函数测试) C++以螺旋方式打印m * n矩阵的算法完整源码(定义,实现,main函数测 ...
- 顺时针打印3*3矩阵
import java.util.ArrayList; public class Mytest { //剑指OFFer 顺时针打印n*m矩阵 //思路 模拟过程 以顺时针顺序打印几层 取决于行数与列数 ...
- 牛客网 在线编程 之字形矩阵打印
题目描述 对于一个矩阵,请设计一个算法,将元素按"之"字形打印.具体见样例. 给定一个整数矩阵mat,以及他的维数nxm,请返回一个数组,其中元素依次为打印的数字. 测试样例: [ ...
- C语言实现上三角蛇形矩阵不用数组,C/C++编程笔记:C++ 嵌套循环,含循环打印及蛇形矩阵实例...
也称为多循环,在一个循环中嵌套使用一个或多个循环. 嵌套循环的基本结构就是在一个循环中,循环体包含了另一个循环的情况.下面我用几个嵌套循环的例子来深入理解嵌套循环. 循环图案打印 分别打印下面三种图案 ...
- 华中地区高校第七届ACM程序设计大赛——之字形矩阵【2012年5月27日】
题意:输入a b Right 或 a b Down ,根据输入输出之字形路径的矩阵. 1 #include <stdio.h> 2 int xx[4]={0,1,-1,1},yy[4]={ ...
- 平方矩阵(回字形矩阵)
题目: 输入整数N,输出一个N阶的回字形二维数组. 数组的最外层为1,次外层为2,以此类推. 输入格式: 输入包含多行,每行包含-个整数N. 当输入行为N = 0时,表示输入结束,且该行无需作任何处理 ...
- 【矩阵】- “之”字形打印
目录 矩阵转圈打印 代码 测试 矩阵转圈打印 代码 private static void printMatrix(int [][] matrix) {int start1X = 0; int sta ...
- 剑指offer十九之顺时针打印矩阵
一.题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- python顺时针打印矩阵_python实现顺时针打印矩阵
面试题之顺时针打印矩阵,Python实现,供大家参考,具体内容如下 问题描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,输入如下矩阵: 则依次打印出数字1,2,3,4,8, ...
最新文章
- 话说:学好C语言,走遍天下都不怕
- Linux内核--网络栈实现分析(一)--网络栈初始化--转
- k8s Service的类型和实现流程图解
- AutoMapper之投影
- IT 实力较量:决战超级数据中心之巅
- Spring 是什么
- 在启动时从配置文件中读取对象
- vSphere 5.5:使用 RVC VSAN 监控工具第 2 部分
- 简述tcp协议的可靠性有哪些机制_腾讯面试HTTP与TCP/IP20连问,你能答出多少?
- js操作动态表格内元素
- 整理cin.getline与getline函数
- 教大家如何选购直播声卡
- 工业级ERPS环网协议交换机千兆4光8电工业级冗余环网以太网交换机工业光纤环网交换机
- 论单片机程序固件保护的重要性和方法
- 操作系统不等于 Linux,六问操作系统新时代 | 1024 程序员节
- 贴吧无耻霸屏技术! 几万阅读量的微信公众号都偷偷的使用它
- CUDA学习(二)-NVCC的编译过程及命令
- 【计算机三级】网路技术学习笔记 第七章 路由器配置及使用
- python用pow计算负数的平方根_pow(x, 0.5)能够计算x的平方根,计算负数的平方根将产生:...
- Kinect for Windows SDK v2.0 开发笔记 (五)骨骼帧与笑面男
热门文章
- Unable to create the django_migrations table 迁移文件时报错
- Python进阶系列 - 20讲 with ... as:
- 二、8.根据一个收件人列表,输出姓名:xxx 电话:xxx 收货地址:xxx姓名:xxx 电话:xxx 收货地址:xxx的格式.
- 【无标题】HTML做一个简单漂亮的宠物网页(纯html代码)宠物 5页(二级菜单)
- 电子邮件营销技巧有哪些?五大趣味技巧分享!
- 文件10:文件路径-信息查询方法
- C++ 指针中:指针数组 指向指针数组的指针 指向指针的指针
- 【Web系列二十】Django+Celery+Asgiref+Channels+协程锁实现Websocket异步并发
- 配色网站50个(转载)
- Apache Calcite 实现方言转换