zoukankan      html  css  js  c++  java
  • [POI2009]Tab

    Description
    2个n( imes)m矩阵,保证同一个矩阵中元素两两不同。问能否通过若干次交换两行或交换两列把第一个矩阵变成第二个。

    Input
    第一行正整数T(1≤T≤10)表示数据组数.
    每组数据包括:第一行nm(1≤n,m≤1000)2个n行m列的整数矩阵,
    元素绝对值均在10^6以内

    Output
    每组数据输出“TAK”/“NIE”表示能/不能.

    Sample Input
    2
    4 3
    1 2 3
    4 5 6
    7 8 9
    10 11 12
    11 10 12
    8 7 9
    5 4 6
    2 1 3
    2 2
    1 2
    3 4
    5 6
    7 8

    Sample Output
    TAK
    NIE


    这题随便乱搞即可

    找到第一个矩阵中的每一行应该对应第二个矩阵的某一行,然后求出置换序列,最后判断每一行的置换序列是否一样即可

    然后找到对应的行数我就是sort+hash……反正巨蠢……

    /*program from Wolfycz*/
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x7f7f7f7f
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x>=10)     print(x/10);
    	putchar(x%10+'0');
    }
    const int N=1e3,p=1e9+7,digit=233,limit=1e6;
    int A[N+10][N+10],B[N+10][N+10],_A[N+10][N+10],_B[N+10][N+10];
    int cnt[(limit<<1)+10],pol[N+10];
    struct S1{
    	int hash,ID;
    	void insert(int a,int b){hash=a,ID=b;}
    	bool operator <(const S1 &x)const{return hash<x.hash;}
    }HA[N+10],HB[N+10];
    int n,m;
    int Hash(int *a){
    	int res=0;
    	for (int i=1;i<=m;i++)	res=(1ll*res*digit+a[i])%p;
    	return res;
    }
    void work(){
    	n=read(),m=read();
    	for (int i=1;i<=n;i++){
    		for (int j=1;j<=m;j++)	A[i][j]=_A[i][j]=read()+limit;
    		sort(_A[i]+1,_A[i]+1+m);
    		HA[i].insert(Hash(_A[i]),i);
    	}
    	for (int i=1;i<=n;i++){
    		for (int j=1;j<=m;j++)	B[i][j]=_B[i][j]=read()+limit;
    		sort(_B[i]+1,_B[i]+1+m);
    		HB[i].insert(Hash(_B[i]),i);
    	}
    	sort(HA+1,HA+1+n),sort(HB+1,HB+1+n);
    	for (int i=1;i<=n;i++)	if (HA[i].hash!=HB[i].hash){printf("NIE
    ");return;}
    	for (int i=1;i<=m;i++)	cnt[B[HB[1].ID][i]]=i;
    	for (int i=1;i<=m;i++)	pol[i]=cnt[A[HA[1].ID][i]];
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=m;j++)
    			if (A[HA[i].ID][j]!=B[HB[i].ID][pol[j]]){printf("NIE
    ");return;}
    	printf("TAK
    ");
    }
    int main(){
    	for (int Data=read();Data;Data--)	work();
    	return 0;
    }
    
  • 相关阅读:
    求幂运算、多项式乘法及Horner法则的应用
    JAVA泛型中的类型擦除及为什么不支持泛型数组
    关于递归的理解及递归表达式复杂度分析(以求解最大公约数为例)
    随机序列生成算法---生成前N个整数的一组随机序列
    Windows 与 Linux下关于端口不能访问的问题
    Netty 实现HTTP文件服务器
    字符数组转换成数字
    字符串反转的进一步应用----单词反转
    递归算法编程整数因子分解问题的递归算法
    数据返回[数据库基础]——图解JOIN
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/9102582.html
Copyright © 2011-2022 走看看