题目大意:

给一个n*m的矩阵,每次交换两个大小相同的不重叠的子矩阵,输出最后的矩阵

题目分析:

这题向我们展示了出神入化的链表是如何炼成的。思想都懂,实现是真的需要技术,%%%

用一副链表来表示该矩阵,每个节点记录他的右节点和下节点,这样在交换两个矩阵时,只需要暴力交换两个矩阵的边框,并更新边框外面的相关信息,边框内的信息不用更改(相对位置不变),最后从左上角输出即可。

code

#include<bits/stdc++.h>
using namespace std; namespace IO{
inline int read(){
int i = 0, f = 1; char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') f = -1, ch = getchar();
for(; ch >= '0' && ch <= '9'; ch = getchar()) i = (i << 3) + (i << 1) + (ch - '0');
return i * f;
}
inline void wr(int x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
}
}using namespace IO; const int N = 1005, M = 1005003;
int n, m, q, v[M], num[N][N], tot;
int lst[M][2]; inline int get(int x, int y){
int now = num[0][0];
for(int i = 1; i <= x; i++) now = lst[now][1];
for(int i = 1; i <= y; i++) now = lst[now][0];
return now;
} int main(){
freopen("h.in", "r", stdin);
n = read(), m = read(), q = read();
for(register int i = 1; i <= n; i++)
for(register int j = 1; j <= m; j++)
v[num[i][j] = ++tot] = read();
// for(int i = 1; i <= tot; i++) cout<<v[i]<<endl;
for(register int i = 0; i <= m + 1; i++) num[0][i] = ++tot, num[n + 1][i] = ++tot;
for(register int i = 1; i <= n; i++) num[i][0] = ++tot, num[i][m + 1] = ++tot;
for(register int i = 0; i <= n; i++)
for(register int j = 0; j <= m; j++){
lst[num[i][j]][0] = num[i][j + 1];
lst[num[i][j]][1] = num[i + 1][j];
}
// for(int i = 1; i <= n; i++)
// for(int j = 1; j <= m; j++)
// cout<<i<<" @"<<j<<" "<<lst[num[i][j]][0]<<" "<<lst[num[i][j]][1]<<endl;
for(; q; q--){
int a, b, c, d, h, w;
a = read(), b = read(), c = read(), d = read(), h = read(), w = read();
int pos1 = get(a - 1, b - 1), pos2 = get(c - 1, d - 1);
// cout<<pos1<<" "<<pos2<<endl;
register int t1, t2, ww, hh; for(t1 = pos1, t2 = pos2, ww = 1; ww <= w; ww++)
swap(lst[t1 = lst[t1][0]][1], lst[t2 = lst[t2][0]][1]);
for(hh = 1; hh <= h; hh++)
swap(lst[t1 = lst[t1][1]][0], lst[t2 = lst[t2][1]][0]);
for(t1 = pos1, t2 = pos2, hh = 1; hh <= h; hh++)
swap(lst[t1 = lst[t1][1]][0], lst[t2 = lst[t2][1]][0]);
for(ww = 1; ww <= w; ww++)
swap(lst[t1 = lst[t1][0]][1], lst[t2 = lst[t2][0]][1]);
} int now = num[0][0];
for(register int i = 1; i <= n; i++){
for(register int j = 1, t = now = lst[now][1]; j <= m; j++)
cout<<v[t = lst[t][0]]<<" ";
cout<<endl;
}
return 0;
}

NOIP模拟 table - 矩阵链表的更多相关文章

  1. 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)

    [描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...

  2. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  3. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  4. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  5. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  6. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  7. 8.1 NOIP模拟11

    8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...

  8. NOIP模拟赛 6.29

    2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...

  9. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

随机推荐

  1. 关于laravel框架分页报错的问题

    因为laravel框架有自己的分页封装,所以与其他框架相比laravel框架的分页的实现要方便的多 只要分别在php脚本与视图中使用 $data=DB::table('index_pic')-> ...

  2. Maven搭建Spring Security3.2项目详解

    本来是打算在上一篇SpringMVC+Hibernate上写的,结果发现上面那篇 一起整合的,结果发现上一篇内容实在是太长了,就另起一篇,这篇主要是采用 Maven搭建Spring+SpringMVC ...

  3. JS实现动画方向切换效果(包括:撞墙反弹,暂停继续左右运动等)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. UVA 10391 - Compound Words 字符串hash

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. python3 turtle 画围棋棋盘

    python3 环境 利用turtle模块画出 围棋棋盘 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan impor ...

  6. 写给自己的TypeScript 入门小纲

    前几日,在知乎上写了一些技术类的文章,有人私信问我,是不是要找一份工作,有没有想过要跳槽,然后我回到,你们公司都是用的什么框架什么技术,他罗列了一堆,其中就包含了TypeScript,我甚至不知道有这 ...

  7. java三大特性:封装、继承、多态

    Java三大特性之封装   一.定义 封装性指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问. 二.使用封装的好处: 1 ...

  8. 如何安装Python环境以及为Visual Studio 2012安装Python插件

    (一)首先,我机器上的开发环境安装的是Visual Studio 2012版本,系统为window7,64位,要安装的Python版本为python3.4-x64,双击安装包安装Python环境,需要 ...

  9. Swift语言之View,Button控件实现小方块在界面上的移动(纯代码实现)

    import UIKit class ViewController: UIViewController { var diamonds:UIView! var diamondsXY = CGRectMa ...

  10. PHP URL参数获取方式的四种例子

    在已知URL参数的情况下,我们可以根据自身情况采用$_GET来获取相应的参数信息($_GET['name']);那,在未知情况下如何获取到URL上的参数信息呢? 第一种.利用$_SERVER内置数组变 ...