2013ACM亚洲区杭州站现场赛1003
水题,将第二个矩阵进行旋转0°,90°,180°,270°,然后统计第一个矩阵和第二个矩阵中数字相同的个数,找出个数最多的一组。
暴力模拟即可。
/**
test cases:
3
1 1 1
2 2 2
3 3 3
3 2 1
3 2 1
3 2 1
//ans=9
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int a[31][31];
int b[31][31];
int temp[31][31];
int compare(int n)
{
int ans = 0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(temp[i][j] == a[i][j]) ans++;
}
}
return ans;
}
void roll_90(int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
temp[i][j] = b[n-j-1][i];
}
}
void roll_180(int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
temp[i][j] = b[n-i-1][n-j-1];
}
}
void roll_270(int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
temp[i][j] = b[j][n-i-1];
}
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
int ans = 0;
int MAX = -32766;
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]);
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
temp[i][j] = b[i][j];
}
ans = compare(n);
MAX = ans;
roll_90(n);
ans = compare(n);
if(ans > MAX) MAX = ans;
roll_180(n);
ans = compare(n);
if(ans > MAX) MAX = ans;
roll_270(n);
ans = compare(n);
if(ans > MAX) MAX = ans;
printf("%d\n",MAX);
}
return 0;
}