Codeforecs 705C Working Routine 模拟(链表)

来源:互联网 发布:中国第一程序员 编辑:程序博客网 时间:2024/05/16 17:40
题意:n*m矩阵,q次操作,每次给出两个矩形的左上角坐标,及宽度和高度.交换这两个不相交的矩形.
n,m<=1e3,q<=1e4,输出最后的矩形.
题意限制的很紧,一条直线上不会有属于不同矩形的格子.

每个格子存其右边和下面元素,交换两个子矩形不改变其内部指针,变得只有其四周一圈的指针O(q*(n+m))

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e3+20;struct node{int val;node *right,*down;}a[N][N];int main(){int n,m,q;while(cin>>n>>m>>q){for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j].val);for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){a[i][j].down=&a[i+1][j];a[i][j].right=&a[i][j+1];}}int x,y,c,d,h,w;node *t1,*t2,*p1,*p2;while(q--){scanf("%d%d%d%d%d%d",&x,&y,&c,&d,&h,&w);p1=&a[0][0],p2=&a[0][0];for(int i=0;i<x-1;i++)p1=p1->down;for(int i=0;i<y-1;i++)p1=p1->right;for(int i=0;i<c-1;i++)p2=p2->down;for(int i=0;i<d-1;i++)p2=p2->right;t1=p1,t2=p2;for(int i=0;i<w;i++){t1=t1->right;t2=t2->right;swap(t1->down,t2->down);}for(int i=0;i<h;i++){t1=t1->down;t2=t2->down;swap(t1->right,t2->right);}t1=p1;t2=p2;for(int i=0;i<h;i++){t1=t1->down;t2=t2->down;swap(t1->right,t2->right);}for(int i=0;i<w;i++){t1=t1->right;t2=t2->right;swap(t1->down,t2->down);}}for(int i=1;i<=n;i++){t1=&a[i][0];for(int j=1;j<=m;j++){t1=t1->right;printf("%d ",t1->val);}printf("\n");}}return 0;} 


原创粉丝点击