题意:
模拟表格的操作:插入行、列,删除行、列,交换格子
题目要求对给出的格子坐标,输出一系列操作后的格子坐标或 GONE。

思路:
我们的思路是记录下操作,然后对每一个坐标进行一遍操作。

先来讲记录操作,我直接用 int 数组记录的,可以将操作进行编号,将编号记录在每一行的 0 下标位置处,如 EX 为 1, DC 为 2, DR 为 3, IC 为 4, IR 为 5,int 数组为 cmd[100010][20](题目中说了 A 不会超过 10,所以列数选 20 足够),cmd[][0] 位置就用来记录操作的编号。至于操作后的数字,可以直接记录到 cmd[][0] 的后面。

然后讲对每一个坐标进行操作,
从题目中我们能够看到如果原先的坐标是 (x, y),
如果是插入行,在 x 前面(包括 x)插入了几行 x 就要加上几;
如果是插入列,在 y 前面(包括 y)插入了几列 y 就要加上几;
如果是删除行,如果删除的行里有 x,则这个坐标就 GONE 了,否则在 x 前面(不包括 x)删除了几行 x 就要减去几;
如果是删除列,如果删除的列里有 y,则这个坐标就 GONE 了,否则在 y 前面(不包括 y)删除了几行 y 就要减去几;
如果是交换格子,比如 (x1, y1) 和 (x2, y2) 互换,如果 (x1, y1) 就是 (x, y),那么 (x, y) 的坐标交换后就变成了 (x2, y2),如果 (x2, y2) 就是 (x, y),那么 (x, y) 的坐标交换后就变成了 (x1, y1)。
这里我们只要按着上面的逻辑和我们储存的操作格式去编写代码就可以了。

下面对样例进行解析:
按照 EX 为 1, DC 为 2, DR 为 3, IC 为 4, IR 为 5 记录下操作后的数组为

坐标 (4, 8) 执行完第一个操作后变成 (3, 8),
执行完第二个操作后变成 (3, 5),
执行完第三个操作后变成 (3, 6),
执行完第四个操作后变成 (4, 6),
执行完第五个操作后变成 (4, 6),
所以结果是 Cell data in (4,8) moved to (4,6)

坐标 (5, 5) 执行完第一个操作后就 GONE 了,
所以结果是 Cell data in (5,5) GONE

坐标 (7, 8) 执行完第一个操作后变成 (5, 8),
执行完第二个操作后变成 (5, 5),
执行完第三个操作后变成 (5, 6),
执行完第四个操作后变成 (7, 6),
执行完第五个操作后变成 (7, 6),
所以结果是 Cell data in (7,8) moved to (7,6)

坐标 (6, 5) 执行完第一个操作后变成 (4, 5),
执行完第二个操作后变成 (4, 4),
执行完第三个操作后变成 (4, 5),
执行完第四个操作后变成 (6, 5),
执行完第五个操作后变成 (1, 2),
所以结果是 Cell data in (6,5) moved to (1,2)

注意:
1. 输出的时候字母别打错了,,,我就在这 WA 了一次
2. 题目中有这样一句话 For each insert and delete
command, the order of the rows or columns in the command has no signicance. 意思就是删除和插入的时候,所以删除或插入的行或列的序号顺序没有意义。即我们删除和插入时要拿原始的坐标和所删除或插入行或列的号比较,而不是删除一个行改变一次坐标再去删除下一行。在一次删除或插入的操作里,只能在最后出现一次对坐标的加减。

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<utility>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
typedef long long LL;int r, c;
int n, m;
int cmd[100010][20];   //EX = 1, DC = 2, DR = 3, IC = 4, IR = 5int main()
{freopen("in.txt", "r", stdin);int kase = 1;while(scanf("%d%d", &r, &c)==2 && r!=0 && c!=0){scanf("%d", &n);char ch[5];for(int i=0; i<n; i++){scanf("%s", ch);if(strcmp(ch, "EX") == 0){cmd[i][0] = 1;for(int j=1; j<=4; j++){scanf("%d", &cmd[i][j]);}}else{if(strcmp(ch, "DC") == 0) cmd[i][0] = 2;else if(strcmp(ch, "DR") == 0) cmd[i][0] = 3;else if(strcmp(ch, "IC") == 0) cmd[i][0] = 4;else if(strcmp(ch, "IR") == 0) cmd[i][0] = 5;scanf("%d", &cmd[i][1]);for(int j=2; j<2+cmd[i][1]; j++){scanf("%d", &cmd[i][j]);}}}if(kase != 1) printf("\n");printf("Spreadsheet #%d\n", kase++);scanf("%d", &m);int r1, c1;for(int i=0; i<m; i++){scanf("%d%d", &r1, &c1);printf("Cell data in (%d,%d) ", r1, c1);for(int j=0; j<n; j++){if(cmd[j][0] == 1){ //EX,交换if(cmd[j][1]==r1 && cmd[j][2]==c1){r1 = cmd[j][3]; c1 = cmd[j][4];}else if(cmd[j][3]==r1 && cmd[j][4]==c1){r1 = cmd[j][1]; c1 = cmd[j][2];}}else if(cmd[j][0] == 2){  //DC,删除列int tmp = 0;for(int k=2; k<2+cmd[j][1]; k++){if(cmd[j][k] == c1){c1 = -1; break;}else if(cmd[j][k] < c1){tmp++;}}if(c1 != -1) c1 -= tmp;}else if(cmd[j][0] == 3){  //DR,删除行int tmp = 0;for(int k=2; k<2+cmd[j][1]; k++){if(cmd[j][k] == r1){r1 = -1; break;}else if(cmd[j][k] < r1){tmp++;}}if(r1 != -1) r1 -= tmp;}else if(cmd[j][0] == 4){  //IC,插入列int tmp = 0;for(int k=2; k<2+cmd[j][1]; k++){if(cmd[j][k] <= c1){tmp++;}}c1 += tmp;}else if(cmd[j][0] == 5){  //IR,插入行int tmp = 0;for(int k=2; k<2+cmd[j][1]; k++){if(cmd[j][k] <= r1){tmp++;}}r1 += tmp;}printf("%d, %d\n", r1, c1);if(r1<0 || c1<0) break;}if(r1<0 || c1<0){printf("GONE\n");}else{printf("moved to (%d,%d)\n", r1, c1);}}}return 0;
}

想看书上的源代码的话看这 (^▽^)
https://github.com/aoapc-book/aoapc-bac2nd

算法竞赛入门经典(紫书)第四章——Spreadsheet Tracking UVA-512相关推荐

  1. 约瑟夫环c语言出现段错误,算法竞赛入门经典 紫书 第四章

    一点小问题 关于判断素数的几点 //该函数有严重缺点: //不能用于n==1和n较大的情况 //在n接近int的最大值时: //若i=46340时,i*i=2147395600//若i=46341时, ...

  2. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  3. 补学图论算法:算法竞赛入门经典(第二版)第十一章:

    补学图论算法:算法竞赛入门经典(第二版)第十一章: 倒排索引还没有实现! 下面是左神的图论算法,并查集笔记.和一个美团题目. ''' https://www.nowcoder.com/live/11? ...

  4. 算法竞赛入门经典读书笔记(四)7.3子集生成

    输入一个数n,输出集合0,1,2,3,n-1的全部子集 方法一:增量构造法: #include <iostream> using namespace std; void print_sub ...

  5. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  6. 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 习题(12/14)

    文章目录 说明 习题 习6-1 UVA 673 平衡的括号 习6-2 UVA 712 S - 树 习6-3 UVA 536 二叉树重建 习6-4 UVA 439 骑士的移动 习6-5 UVA 1600 ...

  7. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...

  8. 《算法竞赛入门经典训练指南》pdf

    下载地址:网盘下载 基本介绍 编辑 内容简介 <算法竞赛入门经典:训练指南>题目多选自近年来ACM/ICPC区域赛和总决赛真题,内容全面,信息量大,覆盖了常见算法竞赛中的大多数细分知识点. ...

  9. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  10. 刘汝佳《算法竞赛入门经典》---总结

    刘汝佳:<算法竞赛入门经典> 三步: 基本的数据结构+算法知识: 数论等数学基本知识: 锻炼联想建模能力.知识与实际相结合,解决实际问题! 第一章:程序设计入门 1.a/b 当a.b为整数 ...

最新文章

  1. PyCharm没有run选项,只有run nosetests in XXX
  2. 【教程】Cubieboard变苹果无线airplay音响
  3. C++调用WebService
  4. SpringSecurity的简单使用使用案列说明
  5. SQL Server 2008存储结构之GAM、SGAM
  6. CentOS6.5 linux 逻辑卷管理 调整分区大小:/dev/mapper/VolGroup-lv_root 50G 47G 16M 100%
  7. java jdk1.5_jdk1.5 64位官方下载
  8. HDU:2188悼念512汶川大地震遇难同胞——选拔志愿者 (威佐夫博弈)
  9. 电脑通信端口带感叹号,如何解决网络适配器里黄色感叹号
  10. java resultset 不关闭_关于ResultSet的关闭问题
  11. 手把手教会你视频转文字怎么操作,快来get
  12. 云e办学习笔记(十六)Redis集成菜单
  13. c语言累加和校验_循环冗余校验(CRC)算法入门
  14. 数据结构笔记_34 赫夫曼编码压缩、解压文件
  15. loadrunner11.0 安装 破解
  16. MySQL_启动_Windows
  17. 有趣的歌单昵称_好听的歌单名称
  18. thinksns开源微博系统 V3上传漏洞
  19. 解决eclipse中没有js代码提示的问题
  20. 批处理启动或停止打印机服务

热门文章

  1. python控制手机模拟器_AppiumDesktop控制手机和安卓模拟器(附视频)
  2. 科学计算机弧度,科学计算器角度换算(学生计算器怎么算角度)
  3. 再探幻读!什么是幻读?为什么会产生幻读,MySQL中是怎么解决幻读的?
  4. WEB常见的HTTP错误代码404 500等
  5. 《SEM长尾搜索营销策略解密》一一2.6 不再被忽视的个体差异
  6. OL3+中链家地图找房功能实现
  7. 函数c语言如何传参数,C语言函数参数传递规律
  8. ubuntu服务器基本安全配置
  9. PS快速去除文字水印图片文字水印去除LOGO
  10. 1-2 图片批量裁剪