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. golang new和make的区别

    自:http://www.cnblogs.com/ghj1976/archive/2013/02/12/2910384.html make用于内建类型(map.slice 和channel)的内存分配 ...

  2. Absolute Horizontal And Vertical Centering In CSS

    Quick CSS Trick: How To Center an Object Exactly In The Center Centering in CSS: A Complete Guide Ab ...

  3. HighCharts 图表插件 自定义绑定 时间轴数据

    HighCharts 图表插件 自定义绑定 时间轴数据,解决时间轴自动显示数据与实际绑定数据时间不对应问题! 可能要用到的源码片段:http://code.662p.com/list/14_1.htm ...

  4. Java学习笔记2——数据类型和转换

    前提知识: 1字节=8bit:1bit以一个二极管表示,代表2个状态(0或者1):2bit代表22即4种状态(00,01,10,11),8bit即是28即256种状态,16bit即是65536种状态. ...

  5. span可编辑 属性 html 可编辑td

    <span contenteditable="true">11111111111111111</span> <!DOCTYPE html PUBLIC ...

  6. PHP 时间处理

    1:获取当前日期格式时间 date("Y-m-d H:i:s");    2:转化为时间戳 strtotime( date("Y-m-d") ) 3:转化为日期 ...

  7. 实现数组类(C++ 拷贝构造函数、拷贝函数)要判断赋值左右对象不相等,坑惨了

    #include <iostream> using namespace std; class ArrayIndexOutOfBoundsException{ // 异常类 public: ...

  8. 06 Django组件-cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

  9. String、Stringbuffer、StringBuffer回顾

    前言: 久了没用到,一下子就忘了..,参考文章:https://www.cnblogs.com/su-feng/p/6659064.html.https://baijiahao.baidu.com/s ...

  10. vue 绑定 HTML Class

    绑定 HTML Class