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

京公网安备 11010502036488号