《Cracking the Coding Interview程序员面试金典》----像素翻转
2017-04-19 15:41
218 查看
时间限制:3秒 空间限制:32768K 热度指数:3726本题知识点: 编程基础 数组 算法知识视频讲解
题目描述
有一副由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> #include<string.h> #include<vector> using namespace std; vector<vector<int> > transformImage(vector<vector<int> > mat, int n) { for (int i = 0; i<n; i++) { for (int j = 0; j<n - i; ++j) swap(mat[i][j], mat[n - 1 - j][n - 1 - i]); } for (int i = 0; i<n / 2; ++i) swap(mat[i], mat[n - 1 - i]); return mat; } void printVector(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; } } int main() { vector<vector<int> > n; vector<int> v; int m; int temp; while (cin >> m) { for (int i = 0; i<m; i++) { v.clear(); for (int j = 0; j < m; j++) { cin >> temp; v.push_back(temp); } n.push_back(v); } printVector(transformImage(n, m),m); } return 0; }不懂的可以加我的QQ群:261035036(IT程序员面试宝典群) 欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~
下面这个是用重载的方式写的:
#include<iostream>#include<string.h>#include<vector>using namespace std;vector<vector<int> > transformImage(vector<vector<int> >& mat, int n) {for (int i = 0; i<n; i++){for (int j = 0; j<n - i; ++j)swap(mat[i][j],mat[n - 1 - j][n - 1 - i]);}for (int i = 0; i<n / 2; ++i)swap(mat[i], mat[n - 1 - i]);return mat;}ostream & operator<<(ostream &out, vector<vector<int> > &A) {for (int i = 0; i<A.size(); i++){for (int j = 0; j<A.at(i).size(); j++){out << A.at(i).at(j) << " ";}out << endl;}return out;}int main(){vector<vector<int> > n;vector<int> v;int m;int temp;while (cin >> m){for (int i = 0; i<m; i++){v.clear();for (int j = 0; j < m; j++){cin >> temp;v.push_back(temp);}n.push_back(v);}//printVector(transformImage(n, m),m);transformImage(n, m);cout << n << endl;}return 0;}