【BZOJ1142】【POI2009】Tab 亂搞

鏈接:

#include <stdio.h>
int main()
{
    puts("轉載請註明出處[vmurder]謝謝");
    puts("網址:blog.csdn.net/vmurder/article/details/45688219");
}

注:我沒用hash。

題解:

首先我們發現無論如何變換,該在一行的還是會在一行,該在一列的還是會在一列。
拿行舉例:我們交換行,在一行的一定還同一行,不在一行的一定還不在同一行;我們交換列,則一個元素的行標號不會被改變,行上的【(在/不在)同一行】這條性質一定不會改變。
然後這樣我們掃兩遍矩陣。
第一遍我們把每行內元素排序,然後再把矩陣的每一行排下序, O(nm) 比較兩個矩陣是否完全相同。

然後第二遍則把列內元素排序,再把每一列排序,然後再比較一遍。

這個做法存在一個坑,就是你怎麼知道這樣就能變換過去?完全是YY的嘛!
呃貌似不是坑。。。。
如果是“TAK”,我們把該在同一行的都搞到對應行(判斷過肯定能的),然後這個時候每行的元素集合肯定是相同的。但是行內可能會有問題。
於是我們再暴力對某一行內元素交換位置使得兩矩陣此行相同。因爲同列的元素集合都一樣,所以兩矩陣其它的所有行的元素也都對應上了。

代碼:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1010
using namespace std;
int n,m,a[N][N],b[N][N];
int s[N],t[N];
struct Eli
{
    int X[N];
    void keep(int n){sort(X+1,X+n+1);}
    bool operator < (const Eli &V)const
    {return X[1]<V.X[1];}
}A[N],B[N];
int main()
{
    int i,j,g;

    for(scanf("%d",&g);g--;)
    {
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&a[i][j]);
        for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&b[i][j]);

        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)A[i].X[j]=a[i][j];
            A[i].keep(m);
        }
        sort(A+1,A+n+1);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)B[i].X[j]=b[i][j];
            B[i].keep(m);
        }
        sort(B+1,B+n+1);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)if(A[i].X[j]!=B[i].X[j])break;
            if(j<=m)break;
        }
        if(i<=n){puts("NIE");continue;}
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)A[i].X[j]=a[j][i];
            A[i].keep(n);
        }
        sort(A+1,A+m+1);
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)B[i].X[j]=b[j][i];
            B[i].keep(n);
        }
        sort(B+1,B+m+1);
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)if(A[i].X[j]!=B[i].X[j])break;
            if(j<=n)break;
        }
        if(i<=m){puts("NIE");continue;}

        puts("TAK");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章