顺时针打印矩阵
2015-09-28 11:21
197 查看
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
方法:
每次打印一个圈,选取左上角(start,start)作为起始。循环继续的条件是columns>startX * 2且rows>startY * 2.
把打印一圈分为4步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。最后一圈有可能退化成只有一行,只有一列,甚至只有一个数字。由于第一步总是需要的,需要第二步的前提条件是终止行号大于起始行号,第三步打印前提是终止列号大于起始列号,第四部同理。
测试用例:数组有多行多列,只有一行,只有一列,只有一个元素
方法:
每次打印一个圈,选取左上角(start,start)作为起始。循环继续的条件是columns>startX * 2且rows>startY * 2.
把打印一圈分为4步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。最后一圈有可能退化成只有一行,只有一列,甚至只有一个数字。由于第一步总是需要的,需要第二步的前提条件是终止行号大于起始行号,第三步打印前提是终止列号大于起始列号,第四部同理。
void PrintMatrixClockwisely(int** numbers, int columns, int rows){ if (numbers == NULL || columns <= 0 || rows <= 0){ return; } int start = 0; while (columns > start * 2 && rows > start * 2){ PrintMatrixInCircle(numbers, columns, rows, start); ++start; } } void PrintMatrixInCircle(int** numbers, int columns, int rows, int start){ int endX = columns - 1 - start; int endY = rows - 1 - start; //从左到右打印一行 for (int i = start; i <= endX; ++i){ int number = numbers[start][i]; printNumber(number); } //从上到下打印一列 if (start < endY){ for (int i = start + 1; i <= endY; ++i){ int number = numbers[i][endX]; printNumber(number); } } //从右到左打印一行 if (start < endX && start < endY){ for (int i = endX - 1; i >= start; --i){ int number = numbers[endY][i]; printNumber(number); } } //从下到上打印一列 if (start < endX && start < endY - 1){ for (int i = endY - 1; i >= start + 1; --i){ int number = numbers[i][start]; printNumber(number); } } }
测试用例:数组有多行多列,只有一行,只有一列,只有一个元素
相关文章推荐
- C#实现矩阵乘法实例分析
- C#中矩阵运算方法实例分析
- C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法
- C#计算矩阵的秩实例分析
- C#实现矩阵转置的方法
- C#检测两个矩阵是否相等的方法
- Javascript图像处理―为矩阵添加常用方法
- 利用C++实现矩阵的相加/相称/转置/求鞍点
- python实现矩阵乘法的方法
- C#判断一个矩阵是否为对称矩阵及反称矩阵的方法
- C#计算矩阵的逆矩阵方法实例分析
- C++实现矩阵原地转置算法
- C#实现矩阵加法、取负、数乘、乘法的方法
- 从零开始学习OpenGL ES之七 – 变换和矩阵
- 初学数模-MATLAB Quick Start! Part II
- Rotate Image
- [Matlab]如何随机产生信息码元矩阵u
- 我对特征值与特征向量的理解
- C语言学习之求解二维数组的最大/最小元素
- 矩阵开方sqrt()和sqrtm()的区别