以前只敢用最普通的二维数组,但是传递是个问题,只好定义成全局;然后旋转只会根据下标间关系进行赋值完成旋转,不通用且难记,误打误撞写成了将b逆时针旋转与a比较相同,比较不符合直觉;现在改成了容器,输入就没那么方便了,需要输入一行前定义一个容器,一行输入完再输下一行,然后是将a顺时针旋转若干角度比较与b是否相同,并且旋转操作改为了先转置再按行反转的策略,好实现也不易出错

// #define _CRT_SECURE_NO_WARNINGS
// #include <cstdio>

// int a[10][10], b[10][10]; // 避免传递二维数组麻烦

// // 逆时针将b旋转 90 度,等价于a顺时针旋转90度
// void rotate90Clockwise(int n) {
//     int temp[10][10];
//     for (int i = 0; i < n; i++) {
//         for (int j = 0; j < n; j++) {
//             temp[i][j] = b[i][j];
//         }
//     }
//     // 通过赋值完成旋转
//     for (int j = n - 1; j >= 0; j--) {
//         for (int i = 0; i < n; i++) {
//             b[n - j - 1][i] = temp[i][j];
//         }
//     }
// }

// int main() {
//     int n;
//     scanf("%d", &n);
//     for (int i = 0; i < n; i++) {
//         for (int j = 0; j < n; j++) {
//             scanf("%d", &a[i][j]);
//         }
//     }
//     for (int i = 0; i < n; i++) {
//         for (int j = 0; j < n; j++) {
//             scanf("%d", &b[i][j]);
//         }
//     }
//     // 判断a是否是b旋转过的矩阵
//     int cnt = 0;
//     while (cnt < 4) {
//         bool flag = true;
//         // 旋转过判断是否相同
//         for (int i = 0; i < n; i++) {
//             for (int j = 0; j < n; j++) {
//                 if (a[i][j] != b[i][j]) {
//                     flag = false;
//                     break;
//                 }
//             }
//             if (!flag) break; // 前面已经有不匹配的了,以后的行也不需要比较
//         }
//         if (!flag) {
//             // 将矩阵b旋转90度再次比较
//             rotate90Clockwise(n);
//             cnt++;
//         }
//         else {
//             break;
//         }
//     }
//     if (cnt < 4) { // 已经匹配完提前出来的
//         printf("%d\n", cnt * 90);
//     }
//     else {
//         printf("-1\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());
    }
}

int main() {
    vector<vector<int>> matrix_a;
    vector<vector<int>> matrix_b;

    // 输入矩阵的行数列数n
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        vector<int> row;
        for (int j = 0; j < n; j++) {
            int num;
            cin >> num;
            row.push_back(num);
        }
        matrix_a.push_back(row);
    }
    for (int i = 0; i < n; i++) {
        vector<int> row;
        for (int j = 0; j < n; j++) {
            int num;
            cin >> num;
            row.push_back(num);
        }
        matrix_b.push_back(row);
    }

    // 判断a是否能通过顺时针旋转得到b
    int cnt = 0;
    while (cnt < 4) {
        bool flag = true;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix_a[i][j] != matrix_b[i][j]) {
                    flag = false;
                    break;
                }
            }
            if (!flag) break;   // 已经不相同,以后的行也不需要比较
        }
        if (!flag) {
            rotateclockwise(matrix_a, n);
            cnt++;
        }
        else {
            printf("%d\n", cnt * 90);
            break;
        }
    }
    if (cnt == 4) {
        printf("-1\n");
    }
    return 0;
}