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