HUD4772诸葛亮的密码
题目描述:给出两个N*N的矩阵(0<N<=30且为整数),固定其中一个矩阵,使另一个矩阵旋转0度,90度,180度与270度,分别与矩阵一重叠并对比对应位置上的数。(矩阵中的数X满足:0<=X<300且X为整数),记旋转方式i时两矩阵对应位置的数相等的个数为ansi,则求最大的ansi值。
输入:首先是一个N,然后依次是两个N*N矩阵,(当输入N=0时表示输入结束)
输出:最大的ansi
分析:行号,列号从0开始计数。
旋转0度时:(i,j)变为(i,j)。
旋转90度时:(i,j)变为(n-1-j,i)。此时(i,j)行i变成了它的列号,它原本的列号j变成了新的行n-1-j号。
旋转180度时:等于两个90度,(i,j)变为(n-1-i,n-1-j)
旋转270度时:(i,j)变为(j,n-1-i)
然后对应比较求最大ansi即可。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[40][40],b[40][40];
while(scanf("%d",&n)==1&&n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&b[i][j]);
int ans=0;
int sum=0;
for(int i=0;i<n;i++)//0 d
for(int j=0;j<n;j++)
if(a[i][j]==b[i][j])
sum++;
ans=max(ans,sum);
sum=0;
for(int i=0;i<n;i++)//90d
for(int j=0;j<n;j++)
if(a[i][j]==b[n-1-j][i])
sum++;
ans=max(ans,sum);
sum=0;
for(int i=0;i<n;i++)//180d
for(int j=0;j<n;j++)
if(a[i][j]==b[n-1-i][n-1-j])
sum++;
ans=max(ans,sum);
sum=0;
for(int i=0;i<n;i++)//270d
for(int j=0;j<n;j++)
if(a[i][j]==b[j][n-1-i])
sum++;
ans=max(ans,sum);
printf("%d\n",ans);
}
}