先%YOUSIKI…
我看到这道题第一想法是判断每一行每一列中元素是否相同…什么排序乱搞…复杂度n^2lgn…
然而YOUSIKI童鞋发现了n^2的算法…%%%OTZ
两个矩阵可以相同的首要条件是矩阵中的元素相同…
然后再考虑如果两个元素在同一行…无论怎么变换都一定在同一行…
并且矩阵中元素互不相同…所以我们记录一下每一个元素分别在两个矩阵中的位置…然后匹配每一行每一列…判断是否有矛盾…
代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000+5,maxm=2000000+5;
int cas,n,m,mp[2][maxn][maxn],r[maxn],c[maxn];
struct M{
int x,y;
}s[2][maxm];
signed main(void){
scanf("%d",&cas);
while(cas--){
int flag=0;
scanf("%d%d",&n,&m);
memset(r,-1,sizeof(r));
memset(c,-1,sizeof(c));
for(int k=0;k<=1;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[k][i][j]),mp[k][i][j]+=1000000,s[k][mp[k][i][j]].x=i,s[k][mp[k][i][j]].y=j;
for(int i=1;i<=n;i++){
if(flag)
break;
for(int j=1;j<=m;j++){
int x=s[1][mp[0][i][j]].x,y=s[1][mp[0][i][j]].y;
if(r[i]==-1||r[i]==x)
r[i]=x;
else{
puts("NIE");flag=1;
break;
}
if(c[j]==-1||c[j]==y)
c[j]=y;
else{
puts("NIE");flag=1;
break;
}
}
}
if(!flag)
puts("TAK");
}
return 0;
}
by >_< NeighThorn