P3593 [POI2015]TAB
题目描述
给定两个 \(n \times m\) 的矩阵,保证同一个矩阵中元素两两不同。
问能否通过若干次交换两行或交换两列把第一个矩阵变成第二个。
能够通过若干次交换把第一个变成第二个,当且仅当在第一个矩阵中位于同一行同一列的数字在第二个矩阵中仍位于同一行同一列。
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1010;
const int S = N * N + 10;
int a[N][N],p[S * 2][2];
int n,m,T;
int main(){
cin >> T;
while(T--){
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++){
scanf("%d",&a[i][j]);
p[a[i][j] + S][0] = i;
p[a[i][j] + S][1] = j;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d",&a[i][j]);
int flag = 1;
for(int i = 1; i <= n; i++){
int fuck = p[a[i][1] + S][0];
for(int j = 1; j <= m; j++)
if(p[a[i][j] + S][0] != fuck)
flag = 0;
}
for(int j = 1; j <= m; j++){
int fuck = p[a[1][j] + S][1];
for(int i = 1; i <= n; i++)
if(p[a[i][j] + S][1] != fuck)
flag = 0;
}
if(flag) cout << "TAK" << endl;
else cout << "NIE" << endl;
}
return 0;
}