UVa512 追踪电子表格中的单元格
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 追踪电子表格中的单元格的更多相关文章
- 4_5 追踪电子表格中的单元格(UVa512)(选做)
在电子表格中的数据都存储在单元格中,它是按行和列(R)(C).一些在电子表格上的操作可以应用于单个单元格(研发),而其他的可以应用于整个行或列.典型的单元操作包括插入和删除行或列和交换单元格内容.一些 ...
- 踪电子表格中的单元格(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) 所示 ...
- 如何把Excel中的单元格等对象保存成图片
对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求 ...
- winform中dataGridView单元格根据值设置新值,彻底解决绑定后数据类型转换的困难
// winform中dataGridView单元格在数据绑定后,数据类型更改困难,只能迂回实现.有时候需要将数字变换为不同的文字描述,就会出现int32到string类型转换的异常,借助CellFo ...
- 读取Excel文件中的单元格的内容和颜色
怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...
- 【表格设置】HTML中合并单元格,对列组合应用样式,适应各浏览器的内容换行
1.常用表格标签 普通 <table> | <tr> | | <th ...
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
一.如何从 Datagrid 中获得单元格的内容 DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items. 但是,W ...
- (很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]
如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.Selec ...
- 如何实时获取DBGrid 中当前单元格输入的内容?
如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理, 用什么事件呢? 所以Field的Onchange事件是没用的. 这个问题简单啊,每输入1 ...
随机推荐
- javascript中构造函数知识总结
构造函数的说明 1.1 构造函数是一个模板 构造函数,是一种函数,主要用来在创建对象时对 对象 进行初始化(即为对象成员变量赋初始值),并且总是与new运算符一起使用. 1.2 new 运算符 new ...
- NYOJ心急的C小加——贪心
这个题会联想到拦截导弹的题目http://codevs.cn/problem/1044/ 首先用动态规划,利用Dilworth定理解题,然而超时了(╥╯^╰╥) 关于Dilworth定理,我的理解: ...
- Android 消息队列机制
在非UI线程使用Handler进行线程通信时,一般都需要进行3个步骤: 创建Looper Looper.prepar() 创建Handler 启动消息循环Looper.loop() 通过这3步,基本就 ...
- 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 ...
- switch注意事项
Day03_SHJavaTraining_4-5-2017 switch注意事项:①switch语句接受的数据类型 switch语句中的表达式的数据类型,是有要求的 JDK1.0 - 1.4 数 ...
- 模拟试题C
模拟试题C 一.单项选择题(2′*14 =28′) 1.双线性法向插值法(Phong Shading)的优点是( ) A)法向计算精确 B)高光域准确 C)对光源和视点没有限制 D)速度较快 2.用编 ...
- 【从零开始】【Java】【1】Git和svn
闲聊 干活快一年了吧,感觉工作中能干的事情也有一点了,但总有种不通透的感觉,查一个问题,能一路查出一堆不明白的东西. 之前新建过文档是记录点点滴滴的知识的,使用上没问题了,但原理什么的还是不懂,想了想 ...
- 函数编程中functor和monad的形象解释
函数编程中functor和monad的形象解释 函数编程中Functor函子与Monad是比较难理解的概念,本文使用了形象的图片方式解释了这两个概念,容易理解与学习,分别使用Haskell和Swift ...
- 使用jquery获取css的top和left属性
使用jquery获取css的top和left属性 因为left和top也都是普通的css属性所以可以使用如下代码来获取 var left = $('#test').css('left'); var t ...
- MySQL安装部署
MySQL安装部署 使用自动化脚本