0%

方阵

方阵旋转

问题描述

蒜头君的班级里有 n^2 (1 ≤ n ≤ 20) 个同学,现在全班同学已经排列成一个 n × n 的方阵,但是老师却临时给出了一组新的列队方案
为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁
这里我们用 0 表示男生,用 1 表示女生
现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的
他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵
不需要旋转则输出 0
顺时针旋转 90° 则输出 1
顺时针旋转 180° 则输出 2
顺时针旋转 270° 则输出 3
若不满足以上四种情况则输出 -1
若满足多种情况,则输出较小的数字

Input

第一行为一个整数 n
接下来的 n 行同学们已经列好的 01 方阵;
再接下来的 n 行表示老师希望的的 01 方阵。

Output

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

Sample

Input: 
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

Output:
1

Limitation

Time limit      1000 ms
Memory limit 524288 kb

解题思路

n 阶方阵 M,对于点 i, j(1 ≤ in, 1 ≤ jn),M[i][j] 顺时针 90°: M[j][n - i + 1],180°: M[n - i + 1][n - j + 1],270°: M[n - j + 1][i]。数组从 0 记到 n - 1 的话得把 n - i + 1 改成 n - 1 - i + 1 - 1 = n - i - 1.

遍历的时候判断是否旋转,根据题意输出即可。

源代码

#include <iostream>
using namespace std;

const int maxN = 410;

int arr1[maxN][maxN];
int arr2[maxN][maxN];

void reset() {
for (int i = 0; i < maxN; i++) {
for (int j = 0; j < maxN; j++) {
arr1[i][j] = 0;
arr2[i][j] = 0;
}
}
}

int rotateM(int n) {
bool r0 = true, r1 = true, r2 = true, r3 = true;

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr1[i][j] != arr2[i][j])
r0 = false;

if (arr1[i][j] != arr2[j][n - i - 1])
r1 = false;

if (arr1[i][j] != arr2[n - i - 1][n - j - 1])
r2 = false;

if (arr1[i][j] != arr2[n - j - 1][i])
r3 = false;
}
}

if (r0)
return 0;
else if (r1)
return 1;
else if (r2)
return 2;
else if (r3)
return 3;
else
return -1;
}

int main() {
int n;
while (!(cin >> n).eof()) {
reset();
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> arr1[i][j];

for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> arr2[i][j];

int res = rotateM(n);
cout << res << endl;
}

return 0;
}