标签:
有一副由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]]
解法:我的想法是先将行列进行互换,再将两列进行互换,最后得到旋转后的矩阵。
1.vector作为二维数组的新用法
2.用swamp函数进行互换也可
#include <iostream>
#include<string>
#include<vector>
using namespace std;
void printMat(vector<vector<int> > mat, int n) {
for(int i=0; i < n; i++) {
for(int j = 0; j < n; j++)
cout << mat[i][j] << " ";
cout << endl;
}
}
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
//90度翻转,先对角互换,再0与n-1之间的列互换即可
//先对角互换
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) { //这里i和j相等的时候就不用互换了
int temp;
temp = mat[i][j] ;
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
//列向量互换
for(int j = 0; j < n /2; j++ )
for(int i = 0; i < n; i++) {
int temp = mat[i][j];
mat[i][j] = mat[i][n-j-1];
mat[i][n-j-1] = temp;
}
printMat(mat, n);
return mat;
}
int main(int argc, char** argv) {
int n = 5;
vector<vector<int> > array(n); //3个向量
for(int i = 0; i < n; i++) {
array[i].resize(n);//设置数组的大小3X3
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
array[i][j] = (n * i + 1 + j);
}
}
//输出
cout << "原始图像:" << endl;
printMat(array, n);
cout << "90度旋转后的数组:" << endl;
transformImage(array, n);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/xiaohaigege/p/5177775.html