Week11_T2

题目描述
蒜头君的班级里有 n^2个同学,现在全班同学已经排列成一个 n∗n 的方阵,但是老师却临时给出了一组新的列队方案。

为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁。这里我们用 0 表示男生,用 1 表示女生。

现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的。

他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵。

  1. 不需要旋转则输出 0
  2. 顺时针旋转 90° 则输出 1
  3. 顺时针旋转 180° 则输出 2
  4. 顺时针旋转 270° 则输出 3

若不满足以上四种情况则输出 -1。

若满足多种情况,则输出较小的数字。

输入格式
第一行为一个整数 n

接下来的 n 行同学们已经列好的 01 方阵;

再接下来的 n 行表示老师希望的的 01 方阵。

输出格式
输出仅有一行,该行只有一个整数,如题所示。

数据约束
对于 100% 的数据中,1≤n≤20。
输出时每行末尾的多余空格,不影响答案正确性。

样例输入

4
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0

样例输出

1

解题思路
首先判断老师要求的是否和输入的一样,如果一样直接输出0即可。
若需要尝试旋转,则按照矩阵旋转的格式进行旋转即可,每次旋转结束之后进行判断。
若转了一圈还没匹配,则输出-1。

#include <iostream>
#include <cstring>
#include <cstdlib>using namespace std;int a[21][21];//输入的
int b[21][21];//老师要的
int c[21][21];//旋转用的tempint n;bool cmp(const int aa[21][21], const int bb[21][21])
{for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){if (aa[i][j] != bb[i][j]){return false;}}return true;
}int main()
{cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)cin >> a[i][j];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)cin >> b[i][j];int times = 0;if (cmp(a, b)){cout << 0 << endl;exit(0);}memset(c, 0, sizeof c);while (times <= 3){for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){c[j][n - i + 1] = a[i][j];}times++;if (cmp(b, c)) break;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){a[i][j] = c[i][j];}}if (times <= 3){cout << times << endl;}else cout << -1 << endl;
}