1 #include "000库函数.h" 2 3 //找位置规律 4 //先不按照规则,使用另一个矩阵 5 class Solution { 6 public: 7 void rotate(vector<vector<int>>& matrix) { 8 vector < vector<int>>v = matrix; 9 int n = matrix.size(); 10 for (int t = 0; t < 1; ++t) { 11 for (int i = 0; i < n; ++i) { 12 for (int j = 0; j < n; ++j) { 13 matrix[j][n - 1 - i] = v[i][j]; 14 } 15 } 16 } 17 } 18 }; 19 20 //1 2 3 7 2 1 7 4 1 21 // 22 //4 5 6 -- > 4 5 6 -- > 8 5 2 23 // 24 //7 8 9 9 8 3 9 6 3 25 // 26 27 class Solution { 28 public: 29 void rotate(vector<vector<int> > &matrix) { 30 int n = matrix.size(); 31 for (int i = 0; i < n / 2; ++i) { 32 for (int j = i; j < n - 1 - i; ++j) { 33 int tmp = matrix[i][j]; 34 matrix[i][j] = matrix[n - 1 - j][i]; 35 matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]; 36 matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]; 37 matrix[j][n - 1 - i] = tmp; 38 } 39 } 40 } 41 }; 42 43 //还有一种解法,首先以从对角线为轴翻转,然后再以x轴中线上下翻转即可得到结果,如下图所示(其中蓝色数字表示翻转轴): 44 // 45 //1 2 3 9 6 3 7 4 1 46 // 47 //4 5 6 -- > 8 5 2 -- > 8 5 2 48 // 49 //7 8 9 7 4 1 9 6 3 50 51 class Solution { 52 public: 53 void rotate(vector<vector<int> > &matrix) { 54 int n = matrix.size(); 55 for (int i = 0; i < n - 1; ++i) { 56 for (int j = 0; j < n - i; ++j) { 57 swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]); 58 } 59 } 60 for (int i = 0; i < n / 2; ++i) { 61 for (int j = 0; j < n; ++j) { 62 swap(matrix[i][j], matrix[n - 1 - i][j]); 63 } 64 } 65 } 66 }; 67 68 //最后再来看一种方法,这种方法首先对原数组取其转置矩阵,然后把每行的数字翻转可得到结果,如下所示(其中蓝色数字表示翻转轴): 69 // 70 //1 2 3 1 4 7 7 4 1 71 // 72 //4 5 6 -- > 2 5 8 -- > 8 5 2 73 // 74 //7 8 9 3 6 9 9 6 3 75 76 77 class Solution { 78 public: 79 void rotate(vector<vector<int> > &matrix) { 80 int n = matrix.size(); 81 for (int i = 0; i < n; ++i) { 82 for (int j = i + 1; j < n; ++j) { 83 swap(matrix[i][j], matrix[j][i]); 84 } 85 reverse(matrix[i].begin(), matrix[i].end()); 86 } 87 } 88 }; 89 void T048() { 90 Solution s; 91 vector < vector<int>>n; 92 n = { 93 {1, 2, 3}, 94 {4, 5, 6}, 95 {7, 8, 9} 96 }; 97 cout << "原矩阵:" << endl; 98 for (auto &a : n) { 99 for (auto b : a) 100 cout << b << " "; 101 cout << endl; 102 } 103 cout << "旋转之后:" << endl; 104 s.rotate(n); 105 for (auto &a : n) { 106 for (auto b : a) 107 cout << b << " "; 108 cout << endl; 109 } 110 111 }