有一个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. Ubuntu下安装C/C++开发环境【!!!有更新!!!Ubuntu14.10下使用eclipse搭建C语言开发环境】

    (1)第一步安装Eclipse,有两种方法,使用软件市场搜索就可以得到,安装就可以 另外一种是使用终端安装,命令例如以下: sudo su进入root模式 输入password 然后 输入:sudo ...

  2. 使用引导扇区维护工具BOOTICE编辑系统启动列表BCD文件

    使用引导扇区维护工具BOOTICE编辑系统启动列表BCD文件 系列文章: 笔记本电脑提速之加装内存条.SSD固态硬盘.光驱位换SSD固态硬盘 笔记本ThinkPad E430c加装内存和SSD固态硬盘 ...

  3. oc83--自定义类实现copy方法

    // // main.m // 自定义类实现copy #import <Foundation/Foundation.h> #import "Person.h" #imp ...

  4. 【Codeforces】 Round #374 (Div. 2)

    Position:http://codeforces.com/contest/721 我的情况 开始还是rank1,秒出C.(11:00机房都走光了,我ma到11:05才走,只打了一个小时) 结果.. ...

  5. go语言笔记——append是内置的函数!!!new是一个函数!!!调试可以使用闭包,本质上是print调试,尼玛!

    内置函数 Go 语言拥有一些不需要进行导入操作就可以使用的内置函数.它们有时可以针对不同的类型进行操作,例如:len.cap 和 append,或必须用于系统级的操作,例如:panic.因此,它们需要 ...

  6. go语言笔记——go环境变量goroot是安装了路径和gopath是三方包路径

    Go 环境变量 Go 开发环境依赖于一些操作系统环境变量,你最好在安装 Go 之间就已经设置好他们.如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go  ...

  7. POJ 2195 Going Home 最小费用流

    POJ2195 裸的最小费用流,当然也可以用KM算法解决,但是比较难写. 注意反向边的距离为正向边的相反数(因此要用SPFA) #include<iostream> #include< ...

  8. bzoj3505 [Cqoi2014]数三角形——组合数+容斥

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3505 好题啊好题...好像还曾经出现在什么智力测试卷中来着...当时不会现在还是无法自己推出 ...

  9. js 获取URL的值

    今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split("?")这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网 ...

  10. UNIX环境高级编程--5

    标准I/O库流和FILE对象:    所有I/O函数都是围绕文件描述符的.当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作.当用标准I/O库打开或者创建一个文件时,我们已 ...