【扬中集训DAY5T1】 交换矩阵

本文介绍了一种使用链表实现矩阵的操作方法,通过定义节点结构体并建立上下左右四个方向的连接,实现了矩阵元素的灵活调整。文章提供了一个具体的C++程序实例,演示了如何进行矩阵区域的修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目链接】

          点击打开链接

【算法】

         链表,对于每个点,存它的上,下,左,右分别是谁

【代码】

          

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000

struct node {
	int val;
	node *l,*r,*u,*d; 
} mat[MAXN+10][MAXN+10];

int i,j,x,N,M,Q,A,B,C,D,H,W;
node *pos;

template <typename T> inline void read(T &x) {
	int f = 1; x = 0;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}

template <typename T> inline void write(T x) {
	if (x < 0) { x = -x; putchar('-'); }
	if (x > 9) write(x/10);
	putchar(x%10+'0');	
}

template <typename T> inline void writeln(T x) {
	write(x);
	puts("");	
}

inline void modify(int X1,int Y1,int X2,int Y2,int W,int H) {
	int i;
	node *pos1,*pos2,*tmp1,*tmp2;
	pos1 = &mat[X1][0]; pos2 = &mat[X2][0];
	for (i = 1; i <= Y1; i++) pos1 = pos1 -> r;
	for (i = 1; i <= Y2; i++) pos2 = pos2 -> r;
	tmp1 = pos1; tmp2 = pos2;
	for (i = 1; i <= W; i++) {
		tmp1 -> l -> r = tmp2;
		tmp2 -> l -> r = tmp1;
		swap(tmp1->l,tmp2->l);
		tmp1 = tmp1 -> d; tmp2 = tmp2 -> d;
	}
	tmp1 = pos1; tmp2 = pos2;
	for (i = 1; i < H; i++) tmp1 = tmp1 -> r;
	for (i = 1; i < H; i++) tmp2 = tmp2 -> r;
	for (i = 1; i <= W; i++) {
		tmp1 -> r -> l = tmp2;
		tmp2 -> r -> l = tmp1;
		swap(tmp1->r,tmp2->r);
		tmp1 = tmp1 -> d; tmp2 = tmp2 -> d;
	}
	tmp1 = pos1; tmp2 = pos2;
	for (i = 1; i <= H; i++) {
		tmp1 -> u -> d = tmp2;
		tmp2 -> u -> d = tmp1;
		swap(tmp1->u,tmp2->u);
		tmp1 = tmp1 -> r; tmp2 = tmp2 -> r;
	}
	tmp1 = pos1; tmp2 = pos2;
	for (i = 1; i < W; i++) tmp1 = tmp1 -> d;
	for (i = 1; i < W; i++) tmp2 = tmp2 -> d;
	for (i = 1; i <= H; i++) {
		tmp1 -> d -> u = tmp2;
		tmp2 -> d -> u = tmp1;
		swap(tmp1->d,tmp2->d);
		tmp1 = tmp1 -> r; tmp2 = tmp2 -> r;
	}
}

int main() {
	
	read(N); read(M); read(Q);
	for (i = 0; i <= 1005; i++) {
		for (j = 0; j <= 1005; j++) {
			mat[i][j].r = &mat[i][j+1];
			mat[i][j].d = &mat[i+1][j];
			mat[i][j].l = &mat[i][j-1];
			mat[i][j].u = &mat[i-1][j];
		}
	}
	for (i = 1; i <= N; i++) {
		for (j = 1; j <= M; j++) {
			read(x);
			mat[i][j].val = x;
  		} 
	} 
	
	while (Q--) {
		read(A); read(B); read(C); read(D); read(H); read(W);
		modify(A,B,C,D,H,W); 
	}
	
	for (i = 1; i <= N; i++) {
		pos = mat[i][0].r;
		for (j = 1; j <= M; j++) {
			write(pos->val);
			if (j != M) putchar(' ');
			pos = pos -> r;
		}	
		puts("");
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值