像素(矩阵)翻转

题目描述
有一副由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. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. void TransformEmage(vector< vector<int> >&mat,int upR,int upC,int downR,int downC)
  5. {
  6. int times = downC - upC;
  7. for ( int i = 0; i < times; ++i)
  8. {
  9. int temp = mat[upR][upC+i];
  10. mat[upR][upC+i] = mat[downR-i][upC];
  11. mat[downR-i][upC] = mat[downR][downC-i];
  12. mat[downR][downC-i] = mat[upR+i][downC];
  13. mat[upR+i][downC] = temp;
  14. }
  15. }
  16. vector< vector< int> > TransformImage( vector< vector< int> > mat, int n)
  17. {
  18. int upR = 0;
  19. int upC = 0; //左上角的点。
  20. int downR = n -1; //右下角的点
  21. int downC = n -1;
  22. while (upC <= downC)
  23. {
  24. TransformEmage(mat,upR,upC,downR,downC);
  25. upR++;
  26. upC++;
  27. downR–;
  28. downC–;
  29. }
  30. return mat;
  31. }
  32. int main()
  33. {
  34. vector< int> v1;
  35. for( int i = 1; i <= 3; ++i)
  36. v1.push_back(i);
  37. vector< int> v2;
  38. for( int i = 4; i <= 6; ++i)
  39. v1.push_back(i);
  40. vector< int> v3;
  41. for( int i = 7; i<= 9; ++i)
  42. v1.push_back(i);
  43. vector< vector< int> > v;
  44. v.push_back(v1);
  45. v.push_back(v2);
  46. v.push_back(v3);
  47. vector< vector< int> > mat = TransformImage(v,v.size());
  48. for ( int i = 0; i < mat.size(); ++i)
  49. {
  50. for( int j = 0; j < mat[ 0].size();++j)
  51. cout << mat[i][j] << ” “;
  52. cout << endl;
  53. }
  54. cout << “hello…”<< endl;
  55. return 0;
  56. }



            </div>
题目描述
有一副由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. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. void TransformEmage(vector< vector<int> >&mat,int upR,int upC,int downR,int downC)
  5. {
  6. int times = downC - upC;
  7. for ( int i = 0; i < times; ++i)
  8. {
  9. int temp = mat[upR][upC+i];
  10. mat[upR][upC+i] = mat[downR-i][upC];
  11. mat[downR-i][upC] = mat[downR][downC-i];
  12. mat[downR][downC-i] = mat[upR+i][downC];
  13. mat[upR+i][downC] = temp;
  14. }
  15. }
  16. vector< vector< int> > TransformImage( vector< vector< int> > mat, int n)
  17. {
  18. int upR = 0;
  19. int upC = 0; //左上角的点。
  20. int downR = n -1; //右下角的点
  21. int downC = n -1;
  22. while (upC <= downC)
  23. {
  24. TransformEmage(mat,upR,upC,downR,downC);
  25. upR++;
  26. upC++;
  27. downR–;
  28. downC–;
  29. }
  30. return mat;
  31. }
  32. int main()
  33. {
  34. vector< int> v1;
  35. for( int i = 1; i <= 3; ++i)
  36. v1.push_back(i);
  37. vector< int> v2;
  38. for( int i = 4; i <= 6; ++i)
  39. v1.push_back(i);
  40. vector< int> v3;
  41. for( int i = 7; i<= 9; ++i)
  42. v1.push_back(i);
  43. vector< vector< int> > v;
  44. v.push_back(v1);
  45. v.push_back(v2);
  46. v.push_back(v3);
  47. vector< vector< int> > mat = TransformImage(v,v.size());
  48. for ( int i = 0; i < mat.size(); ++i)
  49. {
  50. for( int j = 0; j < mat[ 0].size();++j)
  51. cout << mat[i][j] << ” “;
  52. cout << endl;
  53. }
  54. cout << “hello…”<< endl;
  55. return 0;
  56. }



            </div>

猜你喜欢

转载自blog.csdn.net/yanceyxin/article/details/82020840