https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=453
法一:算出变化后的表格

#include<stdio.h>
#include<string.h>
#define maxd 100
#define BIG 10000 //注意这里取10000 d中的万位为行坐标,个位为纵坐标
int r, c, n, d[maxd][maxd], d2[maxd][maxd], ans[maxd][maxd], cols[maxd]; //此处cols储存操作行或者列的位置,需要操作的为1,其余为0 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); //遇到1时,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, ); //遇到1时,cnt2 多加一次,
copy(type, ++cnt2, i); //i正常递增 由于将0行或是0列移动到增加的位置,所以增加的空位置内填入的都是0
}
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; //为d赋值,第一行10001,10002……第二行20001,20002……
while(n--) { //接下来输入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[]); //cmd存储操作行为的字符DR、DC、IR、IC。通过cmd[0]和cmd[1]共同组成判断条件
}
}
memset(ans, , sizeof(ans));
for(int i = ; i <= r; i++)
for(int j = ; j <= c; j++) {//原来是30001,上移1行,赋值20001,即从(3,1)变为(2,1)
//d[i][j]值 /10000 %10000 存储的是原来的行数和列数
ans[d[i][j]/BIG][d[i][j]%BIG] = i*BIG+j; //ans存储经过增减调换后的数组,ans的内容为变化后的数组d的坐标
}
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 1000
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==*r0)
{
*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')//IR 2 3
{
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);//R 1 2 3 4
if(cmd[i].c[]=='E'){
scanf("%d%d%d%d",&cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2);}
else{ //IR 2 1 2 DR 3 1 2 4
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");
else printf("moved to (%d,%d)",r0,c0);
}
}
return ;
}
  • 感想
    1.表格中的内容为”行000列“这样的五位数方便统计坐标。
    横标:数/10000
    纵标:数%10000
    2.新数组
    ans[d[i][j]/BIG][d[i][j]%BIG]=i*BIG+j
    保存的是变化后的数组
    3.插入时 cnt2多加一次 i正常递增
    删除时 cnt2少加一次 i正常递增
    cnt2被i覆盖
    4.输出坐标时from(c1,r1) move to (ans[c1][r1]/BIG,ans[c1][r1]%BIG)

UVa512 追踪电子表格中的单元格的更多相关文章

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

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

  2. 踪电子表格中的单元格(Spreadsheet Tracking, ACM/ICPC World Finals 1997, UVa512)

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

  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. javascript中构造函数知识总结

    构造函数的说明 1.1 构造函数是一个模板 构造函数,是一种函数,主要用来在创建对象时对 对象 进行初始化(即为对象成员变量赋初始值),并且总是与new运算符一起使用. 1.2 new 运算符 new ...

  2. NYOJ心急的C小加——贪心

    这个题会联想到拦截导弹的题目http://codevs.cn/problem/1044/ 首先用动态规划,利用Dilworth定理解题,然而超时了(╥╯^╰╥) 关于Dilworth定理,我的理解: ...

  3. Android 消息队列机制

    在非UI线程使用Handler进行线程通信时,一般都需要进行3个步骤: 创建Looper Looper.prepar() 创建Handler 启动消息循环Looper.loop() 通过这3步,基本就 ...

  4. Docker-compose Setup for Self-hosting Development & Deployment Tools

    Last week I wrote about my self-hosted Sentry install in 3 Docker containers. This week I want to br ...

  5. switch注意事项

    Day03_SHJavaTraining_4-5-2017 switch注意事项:①switch语句接受的数据类型 switch语句中的表达式的数据类型,是有要求的 JDK1.0 - 1.4    数 ...

  6. 模拟试题C

    模拟试题C 一.单项选择题(2′*14 =28′) 1.双线性法向插值法(Phong Shading)的优点是( ) A)法向计算精确 B)高光域准确 C)对光源和视点没有限制 D)速度较快 2.用编 ...

  7. 【从零开始】【Java】【1】Git和svn

    闲聊 干活快一年了吧,感觉工作中能干的事情也有一点了,但总有种不通透的感觉,查一个问题,能一路查出一堆不明白的东西. 之前新建过文档是记录点点滴滴的知识的,使用上没问题了,但原理什么的还是不懂,想了想 ...

  8. 函数编程中functor和monad的形象解释

    函数编程中functor和monad的形象解释 函数编程中Functor函子与Monad是比较难理解的概念,本文使用了形象的图片方式解释了这两个概念,容易理解与学习,分别使用Haskell和Swift ...

  9. 使用jquery获取css的top和left属性

    使用jquery获取css的top和left属性 因为left和top也都是普通的css属性所以可以使用如下代码来获取 var left = $('#test').css('left'); var t ...

  10. MySQL安装部署

    MySQL安装部署 使用自动化脚本