http://codeforces.com/contest/1136/problem/C
第一个矩阵可否通过转置,变换成第二个矩阵,可以的话输出“YES”,不可以的话,输出“NO”
转置之后,对角线元素是不变的
用map,或者vector 都可以
#include <iostream>
#include <map>
#include <cstdio>
using namespace std;
const int maxn = 505;
int a[maxn][maxn];
int b[maxn][maxn];
map<int,int> mp[2*maxn];
int main ()
{
int i,j,n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
mp[i+j][a[i][j]]++;
}
}
int flag=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&b[i][j]);
if(mp[i+j][b[i][j]]<=0)
{
flag=0;
break;
}
mp[i+j][b[i][j]]--;
}
}
if(flag)
printf("YES");
else
printf("NO");
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 505;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m, i, j;
cin>>n>>m;
vector<int> a[2*maxn], b[2*maxn];
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
int test;
cin>>test;
a[i+j].push_back(test);
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
int test;
cin>>test;
b[i+j].push_back(test);
}
}
for(i=1;i<=n+m;i++)
{
sort(a[i].begin(),a[i].end());
sort(b[i].begin(),b[i].end());
}
int flag=0;
for(i=1;i<=n+m;i++)
{
if(a[i]!=b[i])
{
flag = 1;
break;
}
}
if(flag)
cout << "NO";
else
cout << "YES";
return 0;
}
判断两个vector 相等
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main ()
{
vector<int> v1,v2;
vector<int>::iterator it;
v1.push_back(1);
v1.push_back(3);
v1.push_back(100);
v2.push_back(100);
v2.push_back(1);
v2.push_back(3);
for(it=v1.begin();it!=v1.end();it++)
{
cout << *it << " ";
}
cout << endl;
for(it=v2.begin();it!=v2.end();it++)
{
cout << *it << " ";
}
cout << endl;
//sort(v1.begin(),v1.end());
//sort(v2.begin(),v2.end());
//没有sort之前,输出NO
//sort之后,输出YES
if(v1==v2)
cout << "YES";
else
cout << "NO";
return 0;
}