这题坑还蛮多的,一开始就想直接从以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;
}

京公网安备 11010502036488号