打印之字形矩阵

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. 解题思路

这题如果扣下标的关系的话将很难写,会陷入局部关系.但是我们从整体出发思路就会开阔很多.和前面的类似,本题采用的方法也是化整为零.

  1. 上坐标(tR,tC)的初始为(0,0),先沿着矩阵的第一行移动(tC++),当达到第一行最右边的元素后,再沿着矩阵最后一列移动 (tR++)。

  2. 下坐标(dR,dC)的初始为(0,0),先沿着矩阵的第一列移动(dR++),当到达第一列最下边的元素时,再沿着矩阵的最后一行一定(dC++)。

  3. 上坐标与下坐标同步移动,每次移动后的上坐标与下坐标的连线就是矩阵中的一条斜线,打印斜线上的元素即可。

  4. 如果上次斜线是从左下向右上打印的,这次一定是从右上向左下打印,反之亦然。总之,可以把打印的方向用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. 参考文献

  1. [算法]“之”字形打印矩阵
  2. C++ 打印之字形矩阵

debug是个好东西,mark!

C++打印之字形矩阵相关推荐

  1. C++以螺旋方式打印m * n矩阵的算法(附完整源码)

    C++以螺旋方式打印m * n矩阵的算法 C++以螺旋方式打印m * n矩阵的算法完整源码(定义,实现,main函数测试) C++以螺旋方式打印m * n矩阵的算法完整源码(定义,实现,main函数测 ...

  2. 顺时针打印3*3矩阵

    import java.util.ArrayList; public class Mytest { //剑指OFFer 顺时针打印n*m矩阵 //思路 模拟过程 以顺时针顺序打印几层 取决于行数与列数 ...

  3. 牛客网 在线编程 之字形矩阵打印

    题目描述 对于一个矩阵,请设计一个算法,将元素按"之"字形打印.具体见样例. 给定一个整数矩阵mat,以及他的维数nxm,请返回一个数组,其中元素依次为打印的数字. 测试样例: [ ...

  4. C语言实现上三角蛇形矩阵不用数组,C/C++编程笔记:C++ 嵌套循环,含循环打印及蛇形矩阵实例...

    也称为多循环,在一个循环中嵌套使用一个或多个循环. 嵌套循环的基本结构就是在一个循环中,循环体包含了另一个循环的情况.下面我用几个嵌套循环的例子来深入理解嵌套循环. 循环图案打印 分别打印下面三种图案 ...

  5. 华中地区高校第七届ACM程序设计大赛——之字形矩阵【2012年5月27日】

    题意:输入a b Right 或 a b Down ,根据输入输出之字形路径的矩阵. 1 #include <stdio.h> 2 int xx[4]={0,1,-1,1},yy[4]={ ...

  6. 平方矩阵(回字形矩阵)

    题目: 输入整数N,输出一个N阶的回字形二维数组. 数组的最外层为1,次外层为2,以此类推. 输入格式: 输入包含多行,每行包含-个整数N. 当输入行为N = 0时,表示输入结束,且该行无需作任何处理 ...

  7. 【矩阵】- “之”字形打印

    目录 矩阵转圈打印 代码 测试 矩阵转圈打印 代码 private static void printMatrix(int [][] matrix) {int start1X = 0; int sta ...

  8. 剑指offer十九之顺时针打印矩阵

    一.题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  9. python顺时针打印矩阵_python实现顺时针打印矩阵

    面试题之顺时针打印矩阵,Python实现,供大家参考,具体内容如下 问题描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,输入如下矩阵: 则依次打印出数字1,2,3,4,8, ...

最新文章

  1. 话说:学好C语言,走遍天下都不怕
  2. Linux内核--网络栈实现分析(一)--网络栈初始化--转
  3. k8s Service的类型和实现流程图解
  4. AutoMapper之投影
  5. IT 实力较量:决战超级数据中心之巅
  6. Spring 是什么
  7. 在启动时从配置文件中读取对象
  8. vSphere 5.5:使用 RVC VSAN 监控工具第 2 部分
  9. 简述tcp协议的可靠性有哪些机制_腾讯面试HTTP与TCP/IP20连问,你能答出多少?
  10. js操作动态表格内元素
  11. 整理cin.getline与getline函数
  12. 教大家如何选购直播声卡
  13. 工业级ERPS环网协议交换机千兆4光8电工业级冗余环网以太网交换机工业光纤环网交换机
  14. 论单片机程序固件保护的重要性和方法
  15. 操作系统不等于 Linux,六问操作系统新时代 | 1024 程序员节
  16. 贴吧无耻霸屏技术! 几万阅读量的微信公众号都偷偷的使用它
  17. CUDA学习(二)-NVCC的编译过程及命令
  18. 【计算机三级】网路技术学习笔记 第七章 路由器配置及使用
  19. python用pow计算负数的平方根_pow(x, 0.5)能够计算x的平方根,计算负数的平方根将产生:...
  20. Kinect for Windows SDK v2.0 开发笔记 (五)骨骼帧与笑面男

热门文章

  1. Unable to create the django_migrations table 迁移文件时报错
  2. Python进阶系列 - 20讲 with ... as:
  3. 二、8.根据一个收件人列表,输出姓名:xxx 电话:xxx 收货地址:xxx姓名:xxx 电话:xxx 收货地址:xxx的格式.
  4. 【无标题】HTML做一个简单漂亮的宠物网页(纯html代码)宠物 5页(二级菜单)
  5. 电子邮件营销技巧有哪些?五大趣味技巧分享!
  6. 文件10:文件路径-信息查询方法
  7. C++ 指针中:指针数组 指向指针数组的指针 指向指针的指针
  8. 【Web系列二十】Django+Celery+Asgiref+Channels+协程锁实现Websocket异步并发
  9. 配色网站50个(转载)
  10. Apache Calcite 实现方言转换