当前位置:   article > 正文

矩阵的转置和旋转_旋转矩阵的转置

旋转矩阵的转置

转置:

转置很简单的,就是a[i][j] -- > a[j][i]即可。可以开辟一个新的二维数组。b[i][j] = a[j][i]即可。

例题:输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。

此时应该怎么办呢?只要根据题目要求,直接输出就可以啦!(解释一下,为什么我的输出部分要写成下面这样,把最后一列单独输出出来, 那是因为在大多数的oj上,运行通过的要求是最后一列输出不准存在空格)。

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. int a[101][101];
  5. int n;
  6. while(cin >> n){
  7. int p, q, i, j;
  8. for(i = 0; i < n; i ++){
  9. for(j = 0; j < n; j ++){
  10. cin >> a[i][j];
  11. }
  12. }
  13. for(i = 0; i < n; i ++){
  14. for(j = 0; j < n - 1; j ++){
  15. cout << a[j][i] << " ";
  16. }
  17. cout << a[n - 1][i] << endl;
  18. }
  19. }
  20. return 0;
  21. }

旋转:

我们这里只分析旋转90度之后的矩阵和原矩阵的联系。旋转180, 270之类的可以理解将旋转后的矩阵再旋转n*90即可。

顺时针:


  1. void swap(long long &a, int &b){
  2. int temp = a;
  3. a = b;
  4. b = temp;
  5. }
  6. void rotate1(long long a[][20], int n){// 顺时针。
  7. for(int i = 0; i < n; i ++){// 先交换主对角线两端的数即可。
  8. for(int j = i; j < n; j ++){
  9. swap(a[i][j], a[j][i]);
  10. }
  11. }
  12. for(int i = 0; i < n ; i ++){
  13. for(int j = 0; j < n / 2; j ++){
  14. swap(a[i][j], a[i][n - 1 - j]);
  15. }
  16. }
  17. }

使用一个新开辟的数组:

  1. void rotate1(long long a[][20], int n){// 顺时针
  2. int y[20][20];
  3. for(int i = 0; i < n; i ++){
  4. for(int j = 0; j < n; j ++){
  5. y[i][j] = a[n - 1 - j][i];
  6. }
  7. }
  8. for(int i = 0; i < n; i ++){
  9. for(int j = 0; j < n; j ++){
  10. a[i][j] = y[i][j];
  11. }
  12. }
  13. }

逆时针:


  1. void swap(long long &a, int &b){
  2. int temp = a;
  3. a = b;
  4. b = temp;
  5. }
  6. void rotate1(long long a[][20], int n){// 逆时针。
  7. for(int i = 0; i < n; i ++){// 先交换主对角线两端的数即可。
  8. for(int j = i + 1; j < n; j ++){
  9. swap(a[i][j], a[j][i]);
  10. }
  11. }
  12. for(int i = 0; i < n / 2; i ++){
  13. for(int j = 0; j < n; j ++){
  14. swap(a[i][j], a[n - 1 - i][j]);
  15. }
  16. }
  17. }

开辟新空间直接转换这里就不提供了。(以上使用long long 没有特别的意思, 只是我刚好做的一题中的要求。)


例题:

Give you a nn matrix, if you rotate it 90 degrees, we call it 1-Matrix, if you rotate it 180 degrees, we call it 2-Matrix, etc … This is said if you rotate the Matrix 90k degrees, then we call it k-Matrix. Now, your task is to calculate all the sum of i-Matrix (0<= i<= k).

它的意思是求旋转n次之后左右的矩阵的和,包括自己本身。

分析:1.旋转360度之后是不是又回到了原来的样子,那么我们可以以这4次旋转的和为一个基底,看看一共进行了多少个4,再把多余出来的加上去进行了吧。2.需要加上自己原来输入的这个矩阵,但是显然它在不停的旋转啊,所以就可以定义一个二维数组将它存起来,在开辟一个做存储和的二维数组即可。

参考代码:

  1. #include<iostream>
  2. using namespace std;
  3. void swap(long long &a, int &b){
  4. int temp = a;
  5. a = b;
  6. b = temp;
  7. }
  8. void rotate1(long long a[][20], int n){// 顺时针。
  9. for(int i = 0; i < n; i ++){// 先交换主对角线两端的数即可。
  10. for(int j = i; j < n; j ++){
  11. swap(a[i][j], a[j][i]);
  12. }
  13. }
  14. for(int i = 0; i < n ; i ++){
  15. for(int j = 0; j < n / 2; j ++){
  16. swap(a[i][j], a[i][n - 1 - j]);
  17. }
  18. }
  19. }
  20. int main(){
  21. int n, m , l, t;
  22. long long a[20][20], b[20][20], c[20][20];
  23. while(cin >> n){
  24. for(int i = 0; i < n; i ++){
  25. for(int j = 0; j < n; j ++){
  26. cin >> a[i][j];
  27. b[i][j] = a[i][j];
  28. c[i][j] = 0;
  29. }
  30. }
  31. rotate1(a, n);
  32. cin >> m;
  33. l = m; m = m / 4;
  34. for(t = 1; t <= 4; t ++){
  35. rotate1(a, n);
  36. for(int i = 0; i < n; i ++){
  37. for(int j = 0; j < n; j ++){
  38. c[i][j] += a[i][j];
  39. }
  40. }
  41. }
  42. for(int i = 0; i < n; i ++){
  43. for(int j = 0; j < n; j ++){
  44. c[i][j] = m * c[i][j];
  45. }
  46. }
  47. for(t = 1; t <= l % 4; t ++){
  48. rotate1(a, n);
  49. for(int i = 0; i < n; i ++){
  50. for(int j = 0; j < n; j ++){
  51. c[i][j] += a[i][j];
  52. }
  53. }
  54. }
  55. for(int i = 0; i < n; i ++){
  56. for(int j = 0; j < n - 1; j ++){
  57. cout << c[i][j] + b[i][j]<< " ";
  58. }
  59. cout << c[i][n - 1] + b[i][n - 1]<< endl;
  60. }
  61. }
  62. return 0;
  63. }


以上就是这篇的所有内容。欢饮您找出错误或者提出改进意见,谢谢!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号