题目链接:http://codeforces.com/contest/1136/problem/C
题意:现在又两个矩阵A, B,问在A矩阵中任选子方阵转置,问是否可以经过多次转置之后让A == B。
解题心得:想了一下无论怎么选择子方阵A矩阵中任一副对角线中元素的种类和个数是不会变的。换句话说如果矩阵A和矩阵B的所有副对角线元素种类和数目相同那就一定可以通过选择子方阵转置让所有副对角线相同。这样就直接检验副对角线就行了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 510;
int matri_a[maxn][maxn], matri_b[maxn][maxn], n, m, a[maxn], b[maxn];//a, b用来放抽取出来的矩阵a和矩阵b的对角线
void init() {
scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
scanf("%d", &matri_a[i][j]);
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
scanf("%d", &matri_b[i][j]);
}
}
}
void get_arr(int w, int r, int c) {//将矩阵a和矩阵b对应的副对角线抽取出来放在数组a, b中
int cnt = 0;
if(!w) {
memset(a, 0, sizeof(a));
while(r <= n && c > 0) {
a[cnt++] = matri_a[r][c];
r++;
c--;
}
sort(a, a+cnt);
} else {
memset(b, 0, sizeof(b));
while(r <= n && c > 0) {
b[cnt++] = matri_b[r][c];
r++;
c--;
}
sort(b, b+cnt);
}
}
bool same() {//检验副对角线中元素的种类和数目是否相同
for(int i=0;i<maxn;i++) {
if(a[i] != b[i]) return false;
}
return true;
}
int main() {
// freopen("1.in", "r", stdin);
init();
int row = 1, col = 1;
while(true) {//逐渐抽取副对角线
if(row > n) break;
get_arr(0, row, col);
get_arr(1, row, col);
if(!same()) {
puts("NO");
return 0;
}
if(col != m)
col++;
else {
row++;
}
}
puts("YES");
return 0;
}