题目要求:
X终于开始玩一些比较高大上的东西了,比如矩阵。给出两个N*N的矩阵A,B。他想知道矩阵A在顺时针旋转一定角度后是否会和矩阵B完全一样。
输入
有多组输入。
每组输入先输入一个整数N(N <= 50),代表矩阵的大小。
接下来的N行,每行有N个整数。代表矩阵A。
再接下来的N行N个整数代表矩阵B。
输出
如果矩阵A在旋转一定角度后能和矩阵B完全一样则输出YES,否则输出NO。
示例输入
2
1 2
3 4
3 1
4 2
2
1 2
3 4
4 2
3 1
示例输出
YES
NO
规律:
1.矩阵的旋转:
矩阵的逆时针旋转基本有四种情况:
0度
90度
180度
270度,(相当于顺向的90度)
90度旋转:
列号变为行号
(n - 行号 - 1)变成列号
规律: a[i][j] = b[j][n - i - 1]
180度旋转:
(n - 行号 -1)变为行号
(m- 列号 + 1)变为列号
规律:a[i][j] = b[n - i - 1][m - j - 1]
270度旋转(相当于顺时针旋转90度):
行号变为列号
(m - 列号 + 1)变为行号
规律:a[i][j] = b[m - j -1][i]
注意:其中n,m分别为原来矩阵的行数和列数。
代码
***:
#include<stdio.h>
#include<math.h>
int main()
{
int i,j;
int a[50][50],b[50][50];
int c;
int d=1;
while(scanf("%d",&c)!=EOF) //控制多组输入Ctrl+z可以终止多组输入
{
for(i=0;i<c;i++)
for(j=0;j<c;j++)
{
scanf("%d",&a[i][j]);
}
for(i=0;i<c;i++)
for(j=0;j<c;j++)
{
scanf("%d",&b[i][j]);
}
for(i=0;i<c;i++)
for(j=0;j<c;j++)
{
if(a[i][j]!=b[i][j]){break;} //不旋转
}
if(i==c&&j==c)
{
printf("YES\n");
continue;
}
for(i=0;i<c;i++)
for(j=0;j<c;j++)
{
if(a[i][j]!=b[j][c-i-1]){break;} //逆时针转90°
}
if(i==c&&j==c)
{
printf("YES\n");
continue; //退出此次循环,进入下一次循环(注意break是终止循环)
}
for(i=0;i<c;i++)
for(j=0;j<c;j++)
{
if(a[i][j]!=b[c-i-1][c-j-1]){break;} //逆时针转180°
}
if(i==c&&j==c)
{
printf("YES\n");
continue;
}
for(i=0;i<c;i++)
for(j=0;j<c;j++)
{
if(a[i][j]!=b[c-j-1][i]){break;} //逆时针转270°
}
if(i==c&&j==c)
{
printf("YES\n");
continue;
}
printf("NO\n");
}
}