Codeforecs 705C Working Routine 模拟(链表)

题意: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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值