测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题