顺时针打印矩阵(旋转矩阵)
2016-07-21 11:46
197 查看
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
解析:注意循环结束的条件:顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会出现某一圈中只包含一行,
要判断从左向右打印和从右向左打印的时候是否会出现重复打印,同样只包含一列时,要判断从上向下打印和从下向上打印的时候是否会出现重复打印的情况
思想:用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。
步骤:
#include <iostream> #include <vector> using namespace std; vector<int> printMatrix(vector<vector<int> > matrix) { vector<int> res; if (matrix.size() == 0) return res; int cols = matrix[0].size(); int rows = matrix.size(); if (cols <= 0 || rows <= 0) return res; int start = 0; while (cols > start * 2 && rows > start * 2) { int endX = cols - 1 - start; int endY = rows - 1 - start; //从左到右 for (int i = start; i <= endX; i++) res.push_back(matrix[start][i]); //从上到下 if (endY > start) { for (int i = start + 1; i <= endY; i++) res.push_back(matrix[i][endX]); } //从右到左 if (endY > start&&endX > start) { for (int i = endX - 1; i >= start; i--) res.push_back(matrix[endY][i]); } //从下到上 if (endY > start + 1 && endX > start) { for (int i = endY - 1; i >= start + 1; i--) res.push_back(matrix[i][start]); } start++; } return res; } int main() { vector<vector<int> > matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } }; vector<int> res = printMatrix(matrix); for (auto num : res) cout << num << " "; cout << endl; system("pause"); return 0; }
相关文章推荐
- 有关四元数
- 顺时针打印矩阵
- 矩阵变换:沿任意轴旋转及其推导
- 【剑指offer】顺时针打印矩阵
- 编程算法 - 旋转矩阵 代码(C)
- 面试题20:顺时针打印矩阵
- 四元素(Quaternion)与旋转
- 三维坐标旋转矩阵
- 旋转矩阵和旋转向量
- 菜鸟系列之C/C++经典试题(十一)
- *【九度OJ1362】|【剑指offer20】顺时针打印矩阵
- 顺时针打印矩阵
- 剑指offer面试题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
- 顺时针打印矩阵 按圈打印 java
- Computing Euler angles from a rotation matrix (翻译)
- 剑指offer——顺时针打印矩阵
- opencv学习(三十五)之仿射变换warpAffine
- 剑指offer:顺时针打印矩阵(java)
- 顺时针打印矩阵
- java面试题:顺时针打印矩阵