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

最新文章

  1. 解析大型.NET ERP系统 自动更新
  2. iOS网络3—UIWebView与WKWebView使用详解
  3. php文件上传参考配置与大文件上传
  4. Android之如何使用JUnit进行单元测试
  5. Linux 打包和压缩 方法详解
  6. loadjs异步加载javascript回调
  7. Step one : 熟悉Unix/Linux Shell 常见命令行 (二)
  8. 办理英属哥伦比亚大学(本科)学历认证『微信171922772』UBC学位证成绩单使馆认证University of British Columbia
  9. 查看Eclipse运行工程时使用的Command Line
  10. R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)
  11. How to emulate a Raspberry Pi on your PC
  12. Linux命令:mapfile
  13. Ubuntu下搭建tftp服务器最简单方法
  14. Apache访问验证方式
  15. Snip for Mac(桌面截图工具)安装
  16. 基于matplotlib的数据可视化(图形填充fill fill_between) - 笔记(二)
  17. 玩转rocketMQ
  18. Mac OS中Java Servlet与Http通信
  19. numeric_limits&lt;&gt;函数
  20. JavaScript 去字符串空格

热门文章

  1. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】
  2. poj2096Collecting Bugs(概率期望dp)
  3. 【weiphp】安装中报错
  4. js 获取图片宽高 和 图片大小
  5. Java多线程(十)线程间通信 join
  6. 【SpringMVC框架】非注解的处理器映射器和适配器
  7. 列表框、分组列表框、标签(label)、分组框(fieldset)、框架(frameset)
  8. EasyUI系列学习(七)-Linkbutton(按钮)
  9. Myeclipse2014安装&amp;破解激活
  10. Git在工作中对项目的操作流程