JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点

Description

Description

Input

Input

Output

Output

Sample Input

4 4 2
a a b b
a a b b
c c d d
c c d d
1 1 3 3 2 2
3 1 1 3 2 2

Sample Output

d d c c
d d c c
b b a a
b b a a

Data Constraint

Data Constraint

Solution

  • 一道模拟题,但是交换矩阵不能暴力交换——时间不允许。

  • 于是用四向链表维护一个点的四个方向的点是什么,

  • 交换时维护矩阵边缘的点的指针即可。

  • 注意: 读入的字符串长度可能长短不一,开三维数组存会爆内存,用一个 Vector 存即可。

Code

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1002;
struct data
{
    int v,u,d,l,r;
}a[N*N];
int tot;
int f[N][N];
vector<int>s[N*N];
inline int read()
{
    int X=0,w=1; char ch=0;
    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
    return X*w;
}
int main()
{
    int n=read(),m=read(),q=read();
    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=m+1;j++)
        {
            f[i][j]=i*(m+2)+j;
            if(i>=1 && i<=n && j>=1 && j<=m)
            {
                char ch=getchar();
                while(!(ch>='a' && ch<='z')) ch=getchar();
                while(ch>='a' && ch<='z') s[f[i][j]].push_back(ch),ch=getchar();
            }
            a[f[i][j]].u=f[i-1][j];
            a[f[i-1][j]].d=f[i][j];
            a[f[i][j]].l=f[i][j-1];
            a[f[i][j-1]].r=f[i][j];
            a[f[i][j]].v=f[i][j];
        }
    }
    while(q--)
    {
        int x1=read(),y1=read();
        int x2=read(),y2=read();
        int l=read(),c=read();
        int z1=a[1].d,z2=a[1].d;
        for(int i=2;i<=x1;i++) z1=a[z1].d;
        for(int i=2;i<=y1;i++) z1=a[z1].r;
        for(int i=2;i<=x2;i++) z2=a[z2].d;
        for(int i=2;i<=y2;i++) z2=a[z2].r;
        for(int i=0,x=a[z1].l,y=a[z2].l;i<l;i++,x=a[x].d,y=a[y].d) swap(a[x].r,a[y].r);
        for(int i=0,x=a[z1].u,y=a[z2].u;i<c;i++,x=a[x].r,y=a[y].r) swap(a[x].d,a[y].d);
        int p=a[z1].l,q=a[z2].l;
        for(int i=1;i<=c;i++) p=a[p].r,q=a[q].r;
        for(int i=0;i<l;i++,p=a[p].d,q=a[q].d) swap(a[p].r,a[q].r);
        p=a[z1].u,q=a[z2].u;
        for(int i=1;i<=l;i++) p=a[p].d,q=a[q].d;
        for(int i=0;i<c;i++,p=a[p].r,q=a[q].r) swap(a[p].d,a[q].d);
        p=z1,q=z2;
        for(int i=0;i<l;i++,p=a[p].d,q=a[q].d) swap(a[p].l,a[q].l);
        p=z1,q=z2;
        for(int i=1;i<=c;i++) p=a[p].r,q=a[q].r;
        for(int i=0;i<l;i++,p=a[p].d,q=a[q].d) swap(a[p].l,a[q].l);
        p=z1,q=z2;
        for(int i=0;i<c;i++,p=a[p].r,q=a[q].r) swap(a[p].u,a[q].u);
        p=z1,q=z2;
        for(int i=1;i<=l;i++) p=a[p].d,q=a[q].d;
        for(int i=0;i<c;i++,p=a[p].r,q=a[q].r) swap(a[p].u,a[q].u);
    }
    for(int i=a[1].d,p=1;p<=n;p++,i=a[i].d,putchar('\n'))
        for(int j=i,q=1;q<=m;q++,j=a[j].r,putchar(' '))
            for(int k=0;k<s[j].size();k++) putchar(s[j][k]);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值