您的位置:首页 > 职场人生

面试6之像素(矩阵)翻转

2017-04-17 13:45 288 查看
题目描述

有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。

测试样例:

[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]

思路:选择左上角的点和右下角的点,这两点就能确定外层的范围,先翻转外层,再左上角的点行和列都加加,右下角的点行和列都减减,继续翻转。



#include<iostream>
using namespace std;
#include<vector>

void TransformEmage(vector< vector<int> >&mat,int upR,int upC,int downR,int downC)
{
int times = downC - upC;

for (int i = 0; i < times; ++i)
{
int temp = mat[upR][upC+i];
mat[upR][upC+i] = mat[downR-i][upC];
mat[downR-i][upC] = mat[downR][downC-i];
mat[downR][downC-i] = mat[upR+i][downC];
mat[upR+i][downC] = temp;
}
}

vector< vector<int> > TransformImage(vector< vector<int> > mat,int n)
{

int upR = 0;
int upC = 0;  //左上角的点。

int downR = n-1; //右下角的点
int downC = n-1;

while (upC <= downC)
{
TransformEmage(mat,upR,upC,downR,downC);

upR++;
upC++;

downR--;
downC--;
}
return mat;
}

int main()
{

vector<int> v1;
for(int i =1; i <=3; ++i)
v1.push_back(i);
vector<int> v2;
for(int i = 4; i <= 6; ++i)
v1.push_back(i);
vector<int> v3;
for(int i = 7; i<= 9; ++i)
v1.push_back(i);

vector< vector<int> > v;
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);

vector<vector<int> > mat = TransformImage(v,v.size());
for (int i = 0; i < mat.size(); ++i)
{
for(int j = 0; j < mat[0].size();++j)
cout << mat[i][j] << " ";
cout <<endl;
}

cout << "hello..."<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: