A25156. 旋转矩阵
填空题
容易
知识点
题目描述
旋转矩阵
题目描述:
给定两个 n × n 的数字矩阵,判断能否通过将其中任意一个矩阵顺时针旋转 0 度或 90 度或 180 度或270 度后,使得两个矩阵对应位置的元素完全相同。
如果满足则输出 "YES",否则输出 "NO"。
例如:n = 3,两个 3 × 3 的数字矩阵如下:

这里我们选择旋转矩阵 1,将矩阵 1 顺时针旋转 0 度、90 度、180 度以及 270 度后的结果分别如下:

不难发现,当矩阵 1 顺时针旋转 180 度后,两个矩阵对应位置的元素完全相同。
输入描述:
本题的每个测试点包含多组测试数据,格式如下:
第一行输入一个整数 T(1≤T≤100),表示测试数据组数;
接下来的 T 组数据:
每组数据的第一行输入一个整数 n(2≤n≤100),表示矩阵的大小;
接下来 n 行,每行输入 n 个整数(0≤整数≤9),表示矩阵 1 中的元素,整数之间以一个空格隔开;
再接下来 n 行,每行输入 n 个整数(0≤整数≤9),表示矩阵 2 中的元素,整数之间以一个空格隔开。
输出描述:
输出 T 行。其中第 i 行表示第 i 组测试数据的判断结果,如果能够通过旋转使得两个数字矩阵对应位置的元素完全相同,则输出 "YES",否则输出 "NO"。
样例输入:
2
3
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
2
1 0
0 1
2 0
0 2样例输出:
YES
NO参考答案
#include <iostream>
#include <unordered_map>
using namespace std;
bool isEqual(int** a, int** b, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] != b[i][j]) return false;
}
}
return true;
}
bool rotate90(int** a, int** b, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] != b[j][n - 1 - i]) return false;
}
}
return true;
}
bool rotate180(int** a, int** b, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] != b[n - 1 - i][n - 1 - j]) return false;
}
}
return true;
}
bool rotate270(int** a, int** b, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] != b[n - 1 - j][i]) return false;
}
}
return true;
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
int** a = new int*[n];
for (int i = 0; i < n; i++) {
a[i] = new int[n];
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
int** b = new int*[n];
for (int i = 0; i < n; i++) {
b[i] = new int[n];
for (int j = 0; j < n; j++) {
cin >> b[i][j];
}
}
if (isEqual(a, b, n) || rotate90(a, b, n) || rotate180(a, b, n) || rotate270(a, b, n)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
for (int i = 0; i < n; i++) {
delete[] a[i];
delete[] b[i];
}
delete[] a;
delete[] b;
}
return 0;
}
上一题
下一题