分析:这道题比较奇葩.因为字符串没有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. bzoj 4596: [Shoi2016]黑暗前的幻想乡【容斥原理+矩阵树定理】

    真是简单粗暴 把矩阵树定理的运算当成黑箱好了反正我不会 这样我们就可以在O(n^3)的时间内算出一个无向图的生成树个数了 然后题目要求每个工程队选一条路,这里可以考虑容斥原理:全选的方案数-不选工程队 ...

  2. bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】

    预处理出g[i][j]表示原串第i个匹配第j个单词需要去掉几个字母(匹配不上为-1) 设f[i]为i及之后满足条件要去掉的最少字母 倒着dp! f[i]初始为f[i+1]+1,转移方程为f[i]=mi ...

  3. swoole多进程处理产生的问题

    以前用swoole的时候,没有涉及到数据库连接,碰到问题没有那么多,后来公司业务原生来写swoole多进程,问题出现很多 1.多进程之间会产生进程隔离,global无效,不能共用一个mysql,red ...

  4. Linux上安装wine qq的方法

    linxu上安装QQ的发 百度网盘 提取码:f2sn 步骤一.安装wine(详见:https://www.winehq.org/download) // ubuntu/ubuntukylin/mint ...

  5. LPS HDOJ 4745 Two Rabbits

    题目传送门 /* 题意:一只兔子顺时针跳,另一只逆时针跳,跳石头权值相等而且不能越过起点 LPS:这道就是LPS的应用,把环倍增成链,套一下LPS,然而并不能理解dp[i][i+n-2] + 1,看别 ...

  6. 题解报告:hdu 2588 GCD(欧拉函数)

    Description The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written ...

  7. 274 H-Index H指数

    给定一位研究者的论文被引用次数的数组(被引用次数是非负整数).写一个方法计算出研究者的H指数.H-index定义: “一位科学家有指数 h 是指他(她)的 N 篇论文中至多有 h 篇论文,分别被引用了 ...

  8. 重新学习Java——Java基本的程序设计结构(二)

    上一节简单回顾了Java基本的一些程序设计的知识,这一节将继续根据<Java核心技术>这本书,进行这方面知识的复习与探索. 1. 字符串 Java字符串实际上就是Unicode字符序列.例 ...

  9. 在struct 中使用string,赋值会报错

    struct中最好使用char来代替string,因为string的大小不是固定的

  10. 鼠标拖拽移动Java界面组件

    默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能. 只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖 ...