NOIP2017赛前模拟 Table(双向链表)

题意:
 给一个N*M的矩阵,每次交换两个形状完全相同的且互不重叠而且没有公共边界的子矩阵,输出最后结果。
题解:
 给每个点挂一个链表记录它右边和下面的点
 %%%凯爷 链表大佬

#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
const int MaxN = 1005003;
int n,m,q,num,v[MaxN],f[MaxN][5],lab[N][N];

inline int Readint(){
    register char ch=getchar();
    register int x=0;
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) x=((x+(x<<2))<<1)+ch-'0',ch=getchar();
    return x;
}

inline int getlab(int a,int b){
    int p=lab[0][0];
    for(register int i=1;i<=a;i++) p=f[p][1];
    for(register int i=1;i<=b;i++) p=f[p][0];
    return p;
}

int main(){
    freopen("lx.in","r",stdin);
    n=Readint(),m=Readint(),q=Readint();
    for(register int i=1;i<=n;i++)
      for(register int j=1;j<=m;j++)
        v[lab[i][j]=++num]=Readint();
    for(register int i=0;i<=m+1;i++) lab[0][i]=++num,lab[n+1][i]=++num;
    for(register int i=1;i<=n;i++) lab[i][0]=++num,lab[i][m+1]=++num;
    for(register int i=0;i<=n;i++)
      for(register int j=0;j<=m;j++)
        f[lab[i][j]][0]=lab[i][j+1],f[lab[i][j]][1]=lab[i+1][j];
    for(int a,b,c,d,h,w,i=1;i<=q;i++){
        a=Readint(),b=Readint(),c=Readint();
        d=Readint(),h=Readint(),w=Readint();
        register int p1=getlab(a-1,b-1),p2=getlab(c-1,d-1);
        register int t1,t2,ww,hh;
        for(t1=p1,t2=p2,ww=1;ww<=w;ww++)
          swap(f[t1=f[t1][0]][1],f[t2=f[t2][0]][1]);
        for(hh=1;hh<=h;hh++)
          swap(f[t1=f[t1][1]][0],f[t2=f[t2][1]][0]);
        for(t1=p1,t2=p2,hh=1;hh<=h;hh++)
          swap(f[t1=f[t1][1]][0],f[t2=f[t2][1]][0]);
        for(ww=1;ww<=w;ww++)
          swap(f[t1=f[t1][0]][1],f[t2=f[t2][0]][1]);
    }
    for(int i=1,p=lab[0][0];i<=n;i++)
    {
        for(int j=1,t=p=f[p][1];j<=m;j++)
            cout<<v[t=f[t][0]]<<" ";
        cout<<'\n';
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值