分析:这道题比较奇葩.因为字符串没有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. centos 7 配置php

    对于我们的目的而言,安装 Apache 只需要在 CentOS 命令终端敲入这条命令就行了: $ sudo yum install httpd $ sudo systemctl enable http ...

  2. Django之序列化

    关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1.serializers           from django.core ...

  3. [C++ 多线程] 学习前瞻

    1 多线程是什么? 1.1 多线程的概念? 说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程. 进程可以简单的理解为一个可以独立运行的程序单位,它是线程的集合,进程就是有一个或多 ...

  4. 简单的win7-cmd命令提示符

    在win7打开cmd窗口 有两个路径:(1)开始 -->所有程序 --> 附件 --> 命令提示 (2)开始 -->在搜索框输入 “cmd”   指令 作用 对文件夹的操作   ...

  5. dubbo面试题

    40 道 Dubbo 面试题及答案:https://blog.csdn.net/BinshaoNo_1/article/details/83024303 (原地址奉上:https://mp.weixi ...

  6. 如何手工搭建本地Yum仓库

    如何手工搭建本地Yum仓库(重点推荐)  https://www.linuxidc.com/Linux/2016-09/135480.htm CentOS7.2 创建本地YUM源和局域网YUM源: h ...

  7. 01-Entity FrameWork如何控制数据的变化

    在Entity Framework所有操作数据就是更新EF容器中的实体状态 public enum EntityState { Added = , Deleted = , Detached = , M ...

  8. golang 并发锁的陷阱

    错误代码示例 package main import ( "sync" "strconv" "fmt" ) type Node struct ...

  9. MySql 1248 - Every derived table must have its own alias

    执行一个sql语句,报错:1248 - Every derived table must have its own alias 提示说每一个衍生出来的表,必须要有自己的别名 执行子查询的时候,外层查询 ...

  10. Redux 中的CombineReducer的函数详解

    combineReducers(reducers) 随着应用变得复杂,需要对 reducer 函数 进行拆分,拆分后的每一块独立负责管理 state 的一部分. combineReducers 辅助函 ...