題目連接:https://codeforces.com/problemset/problem/1136/Cios
題意:c++
給出 $n \times m$ 的矩陣 $A,B$,你能夠對其中任意某個 $k \times k$ 的子矩陣進行轉置操做。spa
問你是否能將 $A$ 變成 $B$。code
題解:blog
無論咱們如何進行轉置,不難發現整個矩陣的任意一條反對角線上的元素構成的集合,都是不會變的。ci
而咱們能夠進一步得出結論,對於 $A,B$ 兩個矩陣,只要知足任意一條反對角線上的它們的元素構成的集合相同,就能從 $A$ 變成 $B$。get
這也很好證實,由於只要我每次都選取 $2 \times 2$ 的子矩陣進行轉置,必然能將任意一條反對角線上的任意兩個相鄰的元素交換位置,而只要能隨意交換相鄰元素,任意一個序列就能夠變成任意的另外一個序列。it
AC代碼:io
#include<bits/stdc++.h> using namespace std; const int K=503; int n,m; vector<int> a[2*K],b[2*K]; int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin>>n>>m; for(int i=1,x;i<=n;i++) for(int j=1;j<=m;j++) cin>>x, a[i+j].push_back(x); for(int i=1,x;i<=n;i++) for(int j=1;j<=m;j++) cin>>x, b[i+j].push_back(x); bool ok=1; for(int k=2;k<=n+m;k++) { sort(a[k].begin(),a[k].end()); sort(b[k].begin(),b[k].end()); for(int i=0;i<a[k].size();i++) if(a[k][i]!=b[k][i]) ok=0; } cout<<(ok?"YES":"NO")<<'\n'; }