以前只敢用最普通的二维数组,但是传递是个问题,只好定义成全局;然后旋转只会根据下标间关系进行赋值完成旋转,不通用且难记,误打误撞写成了将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; }