–>题目传送门<–
题意:
给定两个n * m的矩阵A,B,问A能否通过矩阵变换得到B。
矩阵变换:取A的子方矩阵x*x,然后转置矩阵。
题解:
根据变换,可以得出只能对角线元素交换,所以
以斜行为轴,例(1,1)为第1+1=2行,(i,j)为第i+j行。
如果A和B矩阵的每一行的元素都i相同则一定可以通过转置得到。
如果有某一行有不同的元素,则不行。
具体实现可以利用动态数组存储,然后排序得到结果。
AC代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector <vector<int> >a(1005);
vector <vector<int> >b(1005);
int main()
{
ios::sync_with_stdio(false),cin.tie(),cout.tie();
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int tmp;
cin>>tmp;
a[i+j].push_back(tmp);//第i+j行的元素
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int tmp;
cin>>tmp;
b[i+j].push_back(tmp);//第i+j行的元素
}
}
for(int i=2;i<=n+m;i++)
{
sort(a[i].begin(),a[i].end());//排序
sort(b[i].begin(),b[i].end());//排序
vector <int>:: iterator it=a[i].begin();
vector <int>:: iterator ita=b[i].begin();
for(ita=a[i].begin(),it=b[i].begin();(it!=b[i].end());it++,ita++)//遍历判断
{
if(*it!=*ita)
{
cout<<"NO"<<endl;
return 0;
}
}
}
cout << "YES" << endl;
return 0;
}
欢迎评论!