分析:这道题比较奇葩.因为字符串没有swap函数,所以一个一个字符串交换只有30分.但是我们可以不用直接交换字符串,而是交换字符串的指针,相当于当前位置是哪一个字符串,每次交换int,可以拿60分.

对于二维问题,通常转化为一维问题去考虑,得到适当的方法再应用到二维上来,这道题如果转移到一维上就是给你一个序列,每次交换一对区间,区间不重叠,最后要求顺序输出整个序列,很显然,我们只要记录每个数旁边的数就好了,所以用链表能很快解决.转化到二维上,我们记录一个右方的链表,下方的链表,每次交换操作只需要更改四周的链表就好了.

需要注意的是char数组不能够开成2维的,题目中只告诉了字符串的总长度,因此需要转化为一维的,输出则在前一个字符串的基础上输出.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; int n, m, q, a[maxn][maxn], sum[maxn * maxn], r[maxn * maxn], d[maxn * maxn],tot;
char s[maxn * maxn]; int pos(int down, int right)
{
int x = ;
while (down--)
x = d[x];
while (right--)
x = r[x];
return x;
} int main()
{
scanf("%d%d%d", &n, &m, &q);
for (int i = ; i <= n * m; i++)
{
scanf("%s", s + sum[i - ] + );
sum[i] = sum[i - ] + strlen(s + sum[i - ] + );
}
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
a[i][j] = (i - ) * m + j;
tot = n * m;
for (int i = ; i <= n + ; i++)
for (int j = ; j <= m + ; j++)
if ((i || j) && !a[i][j])
a[i][j] = ++tot;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
r[a[i][j]] = a[i][j + ];
d[a[i][j]] = a[i + ][j];
}
while (q--)
{
int x1, y1, x2, y2, l, c;
scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &l, &c);
int pos1 = pos(x1 - , y1 - ), Pos1 = d[r[pos1]];//先移动到方阵左上角的左上角一格
int pos2 = pos(x2 - , y2 - ), Pos2 = d[r[pos2]];
for (int i = , p1 = d[pos1], p2 = d[pos2]; i <= l; i++, p1 = d[p1], p2 = d[p2]) //更改方阵第一列左边一列
swap(r[p1], r[p2]);
for (int i = , p1 = r[pos1], p2 = r[pos2]; i <= c; i++, p1 = r[p1], p2 = r[p2])
swap(d[p1], d[p2]);
pos1 = Pos1, pos2 = Pos2;
for (int i = ; i < c; i++) //跳到方阵最后一列
{
pos1 = r[pos1];
pos2 = r[pos2];
}
for (int i = , p1 = pos1, p2 = pos2; i <= l; i++, p1 = d[p1], p2 = d[p2]) //交换方阵最后一列
swap(r[p1], r[p2]);
pos1 = Pos1, pos2 = Pos2;
for (int i = ; i < l; i++) //跳到方阵最后一行
{
pos1 = d[pos1];
pos2 = d[pos2];
}
for (int i = , p1 = pos1, p2 = pos2; i <= c; i++, p1 = r[p1], p2 = r[p2]) //交换方阵最后一行
swap(d[p1], d[p2]);
}
for (int i = , p1 = d[]; i <= n; i++, p1 = d[p1])
{
for (int j = , p2 = r[p1]; j <= m; j++, p2 = r[p2]) //p2千万不能写成r[0],有可能d[0]和r[0]不是同一格
{
for (int k = sum[p2 - ] + ; k <= sum[p2]; k++)
printf("%c", s[k]);
printf(" ");
}
printf("\n");
} return ;
}

常州模拟赛d5t3 appoint的更多相关文章

  1. 常州模拟赛d4t1 立方体

    题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...

  2. 常州模拟赛d7t3 水管

    分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...

  3. 常州模拟赛d6t3 噪音

    FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是群体动 ...

  4. bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2

    3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status ...

  5. 常州模拟赛d5t2 mogician

    分析:一个暴力的思想是枚举g,然后枚举每个数ai,看能不能符合要求,这样复杂度是O(nA)的,直接T掉了.也没什么其他的办法了,在暴力的基础上优化一下,优化的关键是要如何快速统计出不满足要求的数的个数 ...

  6. 常州模拟赛d5t1 journalist

    分析:出题人丧心病狂卡spfa......只能用dijkstar+堆优化. 主要的难点是字典序的处理上,一个想法是在做最短路的时候处理,边松弛边记录,比个大小记录最佳答案.具体的思路大概和最短路计数差 ...

  7. 常州模拟赛d4t3 字符串划分

    题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...

  8. 常州模拟赛d4t2 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...

  9. 常州模拟赛d3t3 两只怪物心心相印

    题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...

随机推荐

  1. 虚拟机安装cenos7后ifcfg看网卡无inet地址掩码等信息

    在虚拟机安装centos7,进入系统使用ifconfig命令时,只有lo网卡( 127.0.0.1的ip地址)和eno16777736网卡,而且此网卡没有inet地址.掩码等信息. 这时候查看/etc ...

  2. DHTML_____window对象方法

    <html> <head> <meta charset="utf-8"> <title>window对象方法</title&g ...

  3. USB接口大百科:看完你就分得清充电线了

    http://tech.ifeng.com/a/20151116/41507221_0.shtml

  4. 409 Longest Palindrome 最长回文串

    给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串.在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串.注意:假设字符串的长度不会超过 ...

  5. 306 Additive Number 加法数

    Additive number is a string whose digits can form additive sequence.A valid additive sequence should ...

  6. JSON基础 JS操作JSON总结

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  7. Spring.Net学习笔记(5)-集合注入

    一.开发环境 系统:Win10 编译器:VS2013 .net版本:.net framework4.5 二.涉及程序集 Spring.Core.dll 1.3.1 Common.Loggin.dll ...

  8. apache自带的ab压力测试工具

    httpd-2.4.27-Win64-VC15 链接: https://pan.baidu.com/s/1027MtVwbq1zjUgF7P7Rrkw 密码: ne6a 下载解压后doc窗口cd .. ...

  9. 模式匹配第四弹:if case,guard case,for case

    2016-06-06 7388 作者:Olivier Halligon,原文链接,原文日期:2016-05-16 译者:walkingway:校对:Cee:定稿:numbbbbb 现在我们来重新回顾下 ...

  10. Linux的网卡由eth0变成了eth1或eth2,如何修复??

    背景:做linux下分布式测试的时候,重新安装了两个linux虚拟机,结果分布式脚本没有做好,分布式也没有做成. 今天想练练linux命令,打开vmware,启动linux1 虚拟机,使用ifconf ...