建立一个单向的十字链表 每个元素有两个指针 一个指向右元素一个指向下元素
然后两个矩形互变时 把对应四个边的右指向和下指向互换就实现了两个方块的位置互变了复杂度由o(n^2)优化到O(n)
最后通过指针指向一个个输出各个位置的值
#include<algorithm>
#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
#define maxn 1005
using namespace std;
int n, m, q;
struct node{
int va, right, down;
}no[maxn * maxn];
int po(int x, int y)
{
return x * m + y;
}
int main()
{
scanf("%d %d %d", &n, &m, &q);
for(int i = 1; i <= n; i++)
for(int j = 1; j<= m; j++)
scanf("%d", &no[po(i, j)].va);
for(int i = 0; i <= n; i++)
for(int j = 0; j<= m;j++)
{
no[po(i, j)].right = po(i,j + 1);
no[po(i, j)].down = po(i + 1, j);
}
while(q--)
{
int a, b, c, d, w, h;
scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &h, &w);
int p1 = 0;
for(int i = 1; i < a; i++) p1 = no[p1].down;
for(int i = 1; i < b; i++) p1 = no[p1].right;
int p2 = 0;
for(int i = 1; i < c; i++) p2 = no[p2].down;
for(int i = 1; i < d; i++) p2 = no[p2].right;
int p11 = p1,p22 = p2;
for(int i = 0; i < h; i++)
{
p11 = no[p11].down;
p22 = no[p22].down;
swap(no[p11].right, no[p22].right);
}
for(int i = 0; i < w; i++)
{
p11 = no[p11].right;
p22 = no[p22].right;
swap(no[p11].down, no[p22].down);
}
p11 = p1,p22 = p2;
for(int i = 0; i < w; i++)
{
p11 = no[p11].right;
p22 = no[p22].right;
swap(no[p11].down, no[p22].down);
}
for(int i = 0; i < h; i++)
{
p11 = no[p11].down;
p22 = no[p22].down;
swap(no[p11].right, no[p22].right);
}
}
int p = 0;
for(int i = 1; i <= n; i++)
{
p = no[p].down;
int q = p;
for(int j = 1; j <= m; j++)
{
q = no[q].right;
printf("%d ", no[q].va);
}
printf("\n");
}
return 0;
}