题意是给矩阵a和矩阵b,问能否把a矩阵里的k*k子矩阵转置,得到b矩阵,转置意思就是k*k的子矩阵里,a[i][j]和a[j][i]互换位置。
在纸上画几组样例,就可以观察发现,我们可以通过每次只对2*2的子矩阵进行转置,就能将一条对角线的任意一个元素放在该对角线的任意位置,也就是一条对角线里的元素是可以互相交换的,所以我们只需要把所有a和b矩阵的所有对角线都找出来,一条条对比即可。
#include<bits/stdc++.h>
using namespace std;
int a[505][505],b[505][505];
int vis[505][505];
vector<int>v1[1000],v2[1000];
int main()
{
int n,m,cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&(a[i][j]));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&(b[i][j]));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(!vis[i][j])
{
cnt++;
int v=i,k=j;
for(;v<=n&&k>=1;v++,k--)
{
vis[v][k]=1;
v1[cnt].push_back(a[v][k]);
}
}
}
int tmp=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(!vis[i][j])
{
tmp++;
int v=i,k=j;
for(;v<=n&&k>=1;v++,k--)
{
vis[v][k]=1;
v2[tmp].push_back(b[v][k]);
}
}
}
for(int i=1;i<=cnt;i++)
{
sort(v1[i].begin(),v1[i].end());
sort(v2[i].begin(),v2[i].end());
int sz=v1[i].size();
for(int j=0;j<sz;j++)
if(v1[i][j]!=v2[i][j])
{
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
}