Working routine CodeForces - 706E (链表)

大意: 给定矩阵, q个操作, 每次选两个子矩阵交换, 最后输出交换后的矩阵

双向十字链表模拟就行了

const int N = 1500;
int n, m, q;
struct _ {
	int v,l,r,u,d;
} f[N*N];
int ans[N][N];
int has(int i,int j) {return 1010*(i+2)+(j+2);}
int get(int i,int j) {
	int r = f[has(0,j)].d;
	REP(k,1,i-1) r=f[r].d;
	return r;
}

void pr() {
	REP(j,1,m) {
        int x = get(1,j);
        REP(i,1,n) ans[i][j]=f[x].v,x=f[x].d;
    }   
    REP(i,1,n) {
        REP(j,1,m) printf("%d ", ans[i][j]);hr;
    } 
}

int main() {
	scanf("%d%d%d", &n, &m, &q);
	REP(i,1,n) REP(j,1,m) {
		_ &t = f[has(i,j)];
		scanf("%d", &t.v);
		t.l=has(i,j-1);
		t.r=has(i,j+1);
		t.u=has(i-1,j);
		t.d=has(i+1,j);
	}
	REP(i,1,m) { 
		f[has(0,i)].d=has(1,i);
		f[has(n+1,i)].u=has(n,i);
	}
	REP(i,1,n) { 
		f[has(i,m+1)].l=has(i,m);
		f[has(i,0)].r=has(i,1);
	}
	REP(i,1,q) {
		int a, b, c, d, h, w;
		scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &h, &w);
		int x = get(a,b), y = get(c,d);
		REP(i,1,w) {
			swap(f[f[x].u].d,f[f[y].u].d);
			swap(f[x].u,f[y].u);
			if (i!=w) x = f[x].r, y = f[y].r;
		}
		REP(i,1,h) {
			swap(f[f[x].r].l,f[f[y].r].l);
			swap(f[x].r,f[y].r);
			if (i!=h) x = f[x].d, y = f[y].d;
		}
		REP(i,1,w) {
			swap(f[f[x].d].u,f[f[y].d].u);
			swap(f[x].d,f[y].d);
			if (i!=w) x = f[x].l, y = f[y].l;
		}
		REP(i,1,h) {
			swap(f[f[x].l].r,f[f[y].l].r);
			swap(f[x].l,f[y].l);
			x = f[x].u, y = f[y].u;
		}
	}
	pr();
}

猜你喜欢

转载自www.cnblogs.com/uid001/p/10582252.html
今日推荐