有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1~r,列从左到右编号为1 ~c。如图4-2(a)所示,如果先删除第1、5行,然后删除第3, 6, 7, 9列,结果如图4-2(b) 所示。

接下来在第2、3、5行前各插入一个空行,然后在第3列前插入一个空列,会得到如图4- 3所示结果。

你的任务是模拟这样的n个操作。具体来说一共有5种操作:

  EX r1 c1 r2 c2交换单元格(r1,c1),(r2,c2)。

  <command>A x1 x2 … xA 插入或删除A行或列(DC-删除列,DR-删除行,IC-插入 列,IR-插入行,1≤A≤10)。

在插入/删除指令后,各个x值不同,且顺序任意。接下来是q个查询,每个查询格式 为“r c”,表示查询原始表格的单元格(r,c)。对于每个查询,输出操作执行完后该单元格的新 位置。输入保证在任意时刻行列数均不超过50。

【分析】

  最直接的思路就是首先模拟操作,算出最后的电子表格,然后在每次查询时直接在电子 表格中找到所求的单元格。

(直接上代码,不是很难理解)

#include<stdio.h>
#include<string.h>
#define maxd 100
#define BIG 10000
int r, c, n, d[maxd][maxd], d2[maxd][maxd], ans[maxd][maxd], cols[maxd];
void copy(char type, int p, int q) {
if(type == 'R') {
for(int i = ; i <= c; i++)
d[p][i] = d2[q][i];
}
else {
for(int i = ; i <= r; i++)
d[i][p] = d2[i][q];
}
}
void del(char type) {
memcpy(d2, d, sizeof(d));
int cnt = type == 'R' ? r : c, cnt2 = ;
for(int i = ; i <= cnt; i++) {
if(!cols[i]) copy(type, ++cnt2, i);
}
if(type == 'R') r = cnt2; else c = cnt2;
}
void ins(char type) {
memcpy(d2, d, sizeof(d));
int cnt = type == 'R' ? r : c, cnt2 = ;
for(int i = ; i <= cnt; i++) {
if(cols[i]) copy(type, ++cnt2, );
copy(type, ++cnt2, i);
}
if(type == 'R') r = cnt2; else c = cnt2;
}
int main() {
int r1, c1, r2, c2, q, kase = ;
char cmd[];
memset(d, , sizeof(d));
while(scanf("%d%d%d", &r, &c, &n) == && r) {
int r0 = r, c0 = c;
for(int i = ; i <= r; i++)
for(int j = ; j <= c; j++)
d[i][j] = i*BIG + j;
while(n--) {
scanf("%s", cmd);
if(cmd[] == 'E') {
scanf("%d%d%d%d", &r1, &c1, &r2, &c2);
int t = d[r1][c1]; d[r1][c1] = d[r2][c2]; d[r2][c2] = t;
}
else {
int a, x;
scanf("%d", &a);
memset(cols, , sizeof(cols));
for(int i = ; i < a; i++) { scanf("%d", &x); cols[x] = ; }
if(cmd[] == 'D') del(cmd[]); else ins(cmd[]);
}
}
memset(ans, , sizeof(ans));
for(int i = ; i <= r; i++)
for(int j = ; j <= c; j++) {
ans[d[i][j]/BIG][d[i][j]%BIG] = i*BIG+j;
}
if(kase > ) printf("\n");
printf("Spreadsheet #%d\n", ++kase);
scanf("%d", &q);
while(q--) {
scanf("%d%d", &r1, &c1);
printf("Cell data in (%d,%d) ", r1, c1);
if(ans[r1][c1] == ) printf("GONE\n");
else printf("moved to (%d,%d)\n", ans[r1][c1]/BIG, ans[r1][c1]%BIG);
}
}
return ;
}

  另一个思路是将所有操作保存,然后对于每个查询重新执行每个操作,但不需要计算整 个电子表格的变化,而只需关注所查询的单元格的位置变化。对于题目给定的规模来说,这 个方法不仅更好写,而且效率更高。代码如下:

#include<stdio.h>
#include<string.h>
#define maxd 10000
struct Command {
char c[];
int r1, c1, r2, c2;
int a, x[];
} cmd[maxd];
int r, c, n;
int simulate(int* r0, int* c0) {
for(int i = ; i < n; i++) {
if(cmd[i].c[] == 'E') {
if(cmd[i].r1 == *r0 && cmd[i].c1 == *c0) { *r0 = cmd[i].r2; *c0 = cmd[i].c2; }
else if(cmd[i].r2 == *r0 && cmd[i].c2 == *c0) { *r0 = cmd[i].r1; *c0 = cmd[i].c1; }
}
else {
int dr = , dc = ;
for(int j = ; j < cmd[i].a; j++) {
int x = cmd[i].x[j];
if(cmd[i].c[] == 'I') {
if(cmd[i].c[] == 'R' && x <= *r0) dr++;
if(cmd[i].c[] == 'C' && x <= *c0) dc++;
}
else {
if(cmd[i].c[] == 'R' && x == *r0) return ;
if(cmd[i].c[] == 'C' && x == *c0) return ;
if(cmd[i].c[] == 'R' && x < *r0) dr--;
if(cmd[i].c[] == 'C' && x < *c0) dc--;
}
}
*r0 += dr; *c0 += dc;
}
}
return ;
}
int main() {
int r0, c0, q, kase = ;
while(scanf("%d%d%d", &r, &c, &n) == && r) {
for(int i = ; i < n; i++) {
scanf("%s", cmd[i].c);
if(cmd[i].c[] == 'E') {
scanf("%d%d%d%d", &cmd[i].r1, &cmd[i].c1, &cmd[i].r2, &cmd[i].c2);
}
else {
scanf("%d", &cmd[i].a);
for(int j = ; j < cmd[i].a; j++) scanf("%d", &cmd[i].x[j]);
}
}
if(kase > ) printf("\n");
printf("Spreadsheet #%d\n", ++kase);
scanf("%d", &q);
while(q--) {
scanf("%d%d", &r0, &c0);
printf("Cell data in (%d,%d) ", r0, c0);
if(!simulate(&r0, &c0)) printf("GONE\n");
else printf("moved to (%d,%d)\n", r0, c0);
}
}
return ;
}

踪电子表格中的单元格(Spreadsheet Tracking, ACM/ICPC World Finals 1997, UVa512)的更多相关文章

  1. UVa512 追踪电子表格中的单元格

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. 4_5 追踪电子表格中的单元格(UVa512)(选做)

    在电子表格中的数据都存储在单元格中,它是按行和列(R)(C).一些在电子表格上的操作可以应用于单个单元格(研发),而其他的可以应用于整个行或列.典型的单元操作包括插入和删除行或列和交换单元格内容.一些 ...

  3. 如何把Excel中的单元格等对象保存成图片

    对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求 ...

  4. winform中dataGridView单元格根据值设置新值,彻底解决绑定后数据类型转换的困难

    // winform中dataGridView单元格在数据绑定后,数据类型更改困难,只能迂回实现.有时候需要将数字变换为不同的文字描述,就会出现int32到string类型转换的异常,借助CellFo ...

  5. 读取Excel文件中的单元格的内容和颜色

    怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...

  6. 【表格设置】HTML中合并单元格,对列组合应用样式,适应各浏览器的内容换行

    1.常用表格标签 普通    <table>           |           <tr>          |           |          <th ...

  7. WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter

    一.如何从 Datagrid 中获得单元格的内容 DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items. 但是,W ...

  8. (很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]

    如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.Selec ...

  9. 如何实时获取DBGrid 中当前单元格输入的内容?

    如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理, 用什么事件呢? 所以Field的Onchange事件是没用的. 这个问题简单啊,每输入1 ...

随机推荐

  1. myeclipse中Servlet出错

    在myeclipse中Servlet总是出错,执行的时候一直提示找不到出现404错误, 然后把代码拷贝到eclipse ee中就没有问题,一直不理解怎么回事. 然后发了好长时间试了好些方法,结果把my ...

  2. LeetCode 67. Add Binary (二进制相加)

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  3. cocos2d-x 多触点监听

    [cpp] view plaincopy //首先到cocos2d-x项目下的ios目录下.找到AppController.mm文件,在函数 didFinishLaunchingWithOptions ...

  4. srm 539

    http://mlz000.github.io/2015/07/15/srm-539/ 250 Description: 从若干个盒子中随意选择几个装石头.每一个盒子容量都有上下限,一旦选择使用某个盒 ...

  5. s:actionmessage页面样式失效

    1,  s:actionmessage页面样式失效: 2,解决方式: 将样式直接写入s:actionmessage标签中:<span><s:actionmessage cssSt ...

  6. hdu 2094 产生冠军(拓扑排序)

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. C# 数据库访问

    C# 数据库访问 分类: C#学习笔记2011-07-05 11:26 515人阅读 评论(0) 收藏 举报 数据库c#datasettextboxcommandexception   目录(?)[+ ...

  8. putty+Xmanager登陆Linux,实现图形界面操作.

  9. oracle更新大量数据太慢,可以通过游标实现的例子

    declare cursor city_cur isselect t.new_customer_id,t.old_customer_id from citsonline.crm_customer_tm ...

  10. 产生冠军(toposort)

    http://acm.hdu.edu.cn/showproblem.php?pid=2094 #include <stdio.h> #include <iostream> #i ...