Description
乐乐被小学数学课本中“空间与图形”的内容迷住了,她整天在琢磨着图形的各种变换:对称、旋转、翻转等等。这天,乐乐用“@”和“-”两种字符拼成了一块N x N(1≦N≦20)的方形图案A,现在她想将其转换成新的方形图案B。有以下几种转换方法:
方法1:转90度:图案按顺时针转90度。
方法2:转180度:图案按顺时针转180度。
方法3:转270度:图案按顺时针转270度。
方法4:反射:图案在水平方向翻转。
方法5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
方法6:不改变:原图案不改变。
方法7:无效转换:无法用以上方法得到新图案。
只能选择上述7种方法中的某一种来转换图案。例如有如下一个3*3的图案A:
@-@
---
@-@
要转换成图案B:
@-@
---
@-@
按照上述的方法,有方法2、方法4和方法6共三种方法可以实现这种转换。你只需要输出:2,表示采用序号最小的方法。
你能帮助乐乐写一个程序,来解决这个难题吗?
Input
第1行:单独的一个整数N。
第2行到第N+1行:每行N个字符(不是“@”就是“-”);这是转换前的方块图案。
第N+2行到第2*N+1行:每行N个字符(不是“@”就是“-”);这是转换后的方块图案。
Output
单独的一行包括1到7之间的一个数字,表明需要将转换前的方块变为转换后的方块的转换方法(序号最小者)。
Sample Input
输入样例1:3@-@---@@-@-@@----@输入样例2:4----@@@@--@@------@----@-@@--@@-
Sample Output
输出样例1:1输出样例2:7
#include <iostream>
#define SIZE 1500
using namespace std;
bool a[SIZE][SIZE], b[SIZE][SIZE], t[SIZE][SIZE], t2[SIZE][SIZE], t3[SIZE][SIZE];
int n;
bool comp(bool a[SIZE][SIZE], bool b[SIZE][SIZE]) // 判等
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (a[i][j] != b[i][j])
{
return false;
}
}
}
return true;
}
/*
123
456
789
741
852
963
*/
bool function1(bool a[SIZE][SIZE]) // 第一种方法
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t[i][j] = a[n-j+1][i];
}
}
return comp(t, b);
}
/*
123
456
789
987
654
321
*/
bool function2(bool a[SIZE][SIZE]) // 第二种方法
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t[i][j] = a[n-i+1][n-j+1];
}
}
return comp(t, b);
}
/*
123
456
789
369
258
147
*/
bool function3(bool a[SIZE][SIZE]) // 第三种方法
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t[i][j] = a[j][n-i+1];
}
}
return comp(t, b);
}
/*
123
456
789
321
654
987
*/
bool function4(bool a[SIZE][SIZE])
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t[i][j] = a[i][n-j+1];
}
}
return comp(t, b);
}
bool function5(bool a[SIZE][SIZE])
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t2[i][j] = a[i][n-j+1];
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t3[i][j] = t2[i][j];
}
}
if (function1(t3))
{
return true;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t3[i][j] = t2[i][j];
}
}
if (function2(t3))
{
return true;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
t[i][j] = t2[i][j];
}
}
if (function3(t3))
{
return true;
}
return false;
}
int main(int argc, char** argv)
{
int i, j;
char c;
cin >> n;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
cin >> c;
if (c == '@')
{
a[i][j] = true; // 字符存在bool数组内
}
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
cin >> c;
if (c == '@')
{
b[i][j] = true;
}
}
}
if (function1(a))
{
cout << 1 << endl;
return 0;
}
if (function2(a))
{
cout << 2 << endl;
return 0;
}
if (function3(a))
{
cout << 3 << endl;
return 0;
}
if (function4(a))
{
cout << 4 << endl;
return 0;
}
if (function5(a))
{
cout << 5 << endl;
return 0;
}
if (comp(a, b))
{
cout << 6 << endl;
return 0;
}
cout << 7 << endl;
return 0;
}