这题坑还蛮多的,一开始就想直接从以x,y下标处开始套用上一题做,试了N次根本不行,其中原因x,y不在对角线上时不好直接转置,并且后面按行反转的范围也是matrix[i].begin+y到matrix[i].begin+y+size了,就没那么通用,付出了很多不必要的思考开销,所以还是用通用的思路,把子矩阵分离出来再直接套用,旋转完直接再放回原位即可
// #include <cstdio> // // 顺时针旋转 90 度 // void rotate90Clockwise(int matrix[5][5], int x, int y, int size) { // int temp[5][5]; // // 复制指定区域到临时矩阵 // for (int i = 0; i < size; ++i) { // for (int j = 0; j < size; ++j) { // temp[i][j] = matrix[x + i][y + j]; // } // } // // 旋转临时矩阵 // for (int i = 0; i < size; ++i) { // for (int j = 0; j < size; ++j) { // matrix[x + j][y + size - 1 - i] = temp[i][j]; // } // } // } // // 逆时针旋转 90 度 // void rotate90CounterClockwise(int matrix[5][5], int x, int y, int size) { // int temp[5][5]; // // 复制指定区域到临时矩阵 // for (int i = 0; i < size; ++i) { // for (int j = 0; j < size; ++j) { // temp[i][j] = matrix[x + i][y + j]; // } // } // // 旋转临时矩阵 // for (int i = 0; i < size; ++i) { // for (int j = 0; j < size; ++j) { // matrix[x + size - 1 - j][y + i] = temp[i][j]; // } // } // } // int main() { // int a[5][5]; // int op1, op2, x, y; // for (int i = 0; i < 5; i++) { // for (int j = 0; j < 5; j++) { // scanf("%d", &a[i][j]); // } // } // scanf("%d%d%d%d", &op1, &op2, &x, &y); // // 确定旋转区域的大小 // int size = (op2 == 2) ? 2 : 3; // // 转换为下标 // x -= 1; // y -= 1; // // 前两个数代表操作类型(将大小为4/9的子矩阵进行转置),左上角的数坐标为x,y(从0开始) // // 执行旋转操作 // if (op1 == 1) { // rotate90Clockwise(a, x, y, size); // 顺时针旋转 // } // else if (op1 == 2) { // rotate90CounterClockwise(a, x, y, size); // 逆时针旋转 // } // for (int i = 0; i < 5; i++) { // for (int j = 0; j < 5; j++) { // printf("%d ", a[i][j]); // } // printf("\n"); // } // return 0; // } #include <iostream> #include <vector> #include <algorithm> using namespace std; // 顺时针90度旋转矩阵 void rotateclockwise(vector<vector<int>>& matrix, int n) { for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { swap(matrix[i][j], matrix[j][i]); } } // 以行为单位反转 for (int i = 0; i < n; i++) { reverse(matrix[i].begin(), matrix[i].end()); } } // 逆时针90度旋转矩阵 void rotatecounterclockwise(vector<vector<int>>& matrix, int n) { // 以行为单位反转 for (int i = 0; i < n; i++) { reverse(matrix[i].begin(), matrix[i].end()); } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { swap(matrix[i][j], matrix[j][i]); } } } int main() { vector<vector<int>> matrix; for (int i = 0; i < 5; i++) { vector<int> row; for (int j = 0; j < 5; j++) { int num; cin >> num; row.push_back(num); } matrix.push_back(row); } // 前两个数代表操作类型,xy代表要旋转的矩阵的左上角元素位置,要减1化为下标 int op1, op2, x, y; cin >> op1 >> op2 >> x >> y; x -= 1; y -= 1; int size = (op2 == 2) ? 2 : 3; // 分离出子矩阵 vector<vector<int>> submatrix; for (int i = x; i < x + size; i++) { vector<int> row; for (int j = y; j < y + size; j++) { row.push_back(matrix[i][j]); } submatrix.push_back(row); } if (op1 == 1) { // 顺时针旋转 rotateclockwise(submatrix, size); } else { // 逆时针旋转 rotatecounterclockwise(submatrix, size); } // 放回原矩阵 for (int idx1 = x, idx2 = 0; idx1 < x + size, idx2 < size; idx1++, idx2++) { for (int idx3 = y, idx4 = 0; idx3 < y + size, idx4 < size; idx3++, idx4++) { matrix[idx1][idx3] = submatrix[idx2][idx4]; } } // 输出结果 for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { cout << matrix[i][j] << " "; } cout << endl; } return 0; }