题意:
给你两个矩阵,问你两个矩阵的最大相同元素个数(位置也要求相同),矩阵可以90旋转多次。
思路:
水题,直接模拟就行了,方法很多,可以直接写坐标关系,或者一层一层处理,就是一层一层往里拿出来,比较就行了,两个都写了。
直接交换
#include<stdio.h>
int A[32][32] ,B[32][32] ,C[32][32];
void swap(int n)
{
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
C[i][j] = A[j][n-i+1];
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
A[i][j] = C[i][j];
}
int main ()
{
int n ,i ,j ,ans;
while(~scanf("%d" ,&n) && n)
{
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
scanf("%d" ,&A[i][j]);
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
scanf("%d" ,&B[i][j]);
int ans = 0;
for(int c = 1 ;c <= 4 ;c ++)
{
int sum = 0;
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
if(A[i][j] == B[i][j]) sum ++;
if(ans < sum) ans = sum;
swap(n);
}
printf("%d
" ,ans);
}
return 0;
}
一层一层比较
#include<stdio.h>
int get_len(int c ,int n ,int A[32][32] ,int C[])
{
int tmp = 0 ,i;
for(i = c ;i <= n - c + 1 ;i ++)
C[++tmp] = A[c][i];
for(i = c + 1 ;i <= n - c + 1 ;i ++)
C[++tmp] = A[i][n - c + 1];
for(i = n - c + 1 - 1 ;i >= c ;i --)
C[++tmp] = A[n - c + 1][i];
for(i = n - c + 1 - 1 ;i >= c + 1 ;i --)
C[++tmp] = A[i][c];
return tmp;
}
int main ()
{
int A[32][32] ,B[32][32] ,C[1000] ,D[1000];
int i ,j ,n;
int sum[5];
while(~scanf("%d" ,&n) && n)
{
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
scanf("%d" ,&A[i][j]);
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
scanf("%d" ,&B[i][j]);
sum[1] = sum[2] = sum[3] = sum[4] = 0;
for(int c = 1 ;c <= (n + 1) / 2 ;c ++)
{
int tmp1 = get_len(c ,n ,A ,C);
int tmp2 = get_len(c ,n ,B ,D);
for(i = 1 ;i <= 4 ;i ++)
{
for(j = 1 ;j <= tmp1 ;j ++)
{
int now = j + (n - c + 1 - c) * (i - 1);
if(now > tmp1) now -= tmp1;
if(C[now] == D[j]) sum[i] ++;
}
}
}
int ans = 0;
for(i = 1 ;i <= 4 ;i ++)
if(ans < sum[i]) ans = sum[i];
printf("%d
" ,ans);
}
return 0;
}