bzoj1142:[POI2009]Tab

本文介绍了一种在矩阵中进行元素交换的算法,确保每次交换后元素所在行和列不变。通过记录每个元素的初始位置并进行暴力判断,检查是否满足交换条件。适用于竞赛编程和算法设计场景。

传送门

考虑每次交换都不会改变每个数所在的行和列(不是指编号,而是指和它在同一行或者同一列的数不会发生变化)
由于每个数互不相同,所以记录下每个数所在的行和列,暴力判断就好了
代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void read(int &x) {
    char ch; bool ok;
    for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
    for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int p=1e6;
int T,n,m,x[p*2+10],y[p*2+10],a[1010][1010];
int main()
{
    read(T);
    while(T--)
    {
        read(n),read(m);
        memset(x,0,sizeof x),memset(y,0,sizeof y); 
        for(rg int i=1;i<=n;i++)
            for(rg int j=1,v;j<=m;j++)
                read(v),v+=p,x[v]=i,y[v]=j;
        bool flag=0;
        for(rg int i=1;i<=n;i++)
            for(rg int j=1;j<=m;j++)
            {
                read(a[i][j]);a[i][j]+=p;
                if(x[a[i][j]]!=x[a[i][1]]||!x[a[i][j]])flag=1;
                if(y[a[i][j]]!=y[a[1][j]]||!y[a[i][j]])flag=1;
            }
        if(flag)printf("NIE\n");
        else printf("TAK\n");
    }
}

转载于:https://www.cnblogs.com/lcxer/p/10522508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值