您的位置:首页 > 其它

顺时针打印矩阵(旋转矩阵)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息