Codeforces Round #546 (Div. 2) C Nastya Is Transposing Matrices

  题意是给矩阵a和矩阵b,问能否把a矩阵里的k*k子矩阵转置,得到b矩阵,转置意思就是k*k的子矩阵里,a[i][j]和a[j][i]互换位置。

 在纸上画几组样例,就可以观察发现,我们可以通过每次只对2*2的子矩阵进行转置,就能将一条对角线的任意一个元素放在该对角线的任意位置,也就是一条对角线里的元素是可以互相交换的,所以我们只需要把所有a和b矩阵的所有对角线都找出来,一条条对比即可。

#include<bits/stdc++.h>
using namespace std;
int a[505][505],b[505][505];
int vis[505][505];
vector<int>v1[1000],v2[1000];
int main()
{
    int n,m,cnt=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&(a[i][j]));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&(b[i][j]));

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(!vis[i][j])
            {
                cnt++;
                int v=i,k=j;
                for(;v<=n&&k>=1;v++,k--)
                {
                    vis[v][k]=1;
                    v1[cnt].push_back(a[v][k]);
                }
            }
        }
    int tmp=0;
    memset(vis,0,sizeof(vis));
      for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(!vis[i][j])
            {
                tmp++;
                int v=i,k=j;
                for(;v<=n&&k>=1;v++,k--)
                {
                    vis[v][k]=1;
                    v2[tmp].push_back(b[v][k]);
                }
            }
        }
        for(int i=1;i<=cnt;i++)
        {
            sort(v1[i].begin(),v1[i].end());
            sort(v2[i].begin(),v2[i].end());
            int sz=v1[i].size();
            for(int j=0;j<sz;j++)
                if(v1[i][j]!=v2[i][j])
                {
                    cout<<"NO"<<endl;
                    return 0;
                }
        }
        cout<<"YES"<<endl;

}
原文地址:https://www.cnblogs.com/eason9906/p/11754792.html