题意:给你一个(1000*1000)的矩阵,有10000次操作,每次交换两个同样大小的小矩阵,任何一个小方块不会属于两个矩阵,任一两个相邻的小方块不会分别属于两个矩阵。输出最后的矩阵。
题解:十字链表,暴力。(其实只要两个指针)(m*n)
#include<bits/stdc++.h>
using namespace std;
#define N 1010
struct Node{
int right,down;
int v;
}_Node[N*N];
int a[N][N],b[N][N];
int idx;
int move(int p,int x,int y){
while(x--){
p = _Node[p].down;
}
while(y--){
p = _Node[p].right;
}
return p;
}
void print(int n,int m){
int p = b[0][0];
for(int i=1;i<=n;i++){
p = move(p,1,0);
int ip = p;
for(int j=0;j<m;j++){
ip = _Node[ip].right;
cout<<_Node[ip].v;
if(j+1==m) cout<<endl;
else cout<<" ";
}
}
}
int main(){
ios_base::sync_with_stdio(false);
int n,m,q;
while(cin>>n>>m>>q){
idx = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
b[i][j] = idx++;
_Node[b[i][j]].v = a[i][j];
if(j){
_Node[b[i][j-1]].right = b[i][j];
}
if(i){
_Node[b[i-1][j]].down = b[i][j];
}
}
}
//print(n,m);
while(q--){
int ai,bi,ci,di,hi,wi;
cin>>ai>>bi>>ci>>di>>hi>>wi;
int p1 = move(b[0][0],ai-1,bi-1);
int p2 = move(b[0][0],ci-1,di-1);
int dp1 = move(p1,1,0);
int dp2 = move(p2,1,0);
for(int i=0;i<hi;i++){
swap(_Node[dp1].right,_Node[dp2].right);
dp1 = move(dp1,1,0);
dp2 = move(dp2,1,0);
}
int rp1 = move(p1,0,1);
int rp2 = move(p2,0,1);
for(int i=0;i<wi;i++){
swap(_Node[rp1].down,_Node[rp2].down);
rp1 = move(rp1,0,1);
rp2 = move(rp2,0,1);
}
dp1 = move(p1,1,wi);
dp2 = move(p2,1,wi);
for(int i=0;i<hi;i++){
swap(_Node[dp1].right,_Node[dp2].right);
dp1 = move(dp1,1,0);
dp2 = move(dp2,1,0);
}
rp1 = move(p1,hi,1);
rp2 = move(p2,hi,1);
for(int i=0;i<wi;i++){
swap(_Node[rp1].down,_Node[rp2].down);
rp1 = move(rp1,0,1);
rp2 = move(rp2,0,1);
}
//cout<<q<<":"<<endl;
//print(n,m);
}
print(n,m);
}
return 0;
}