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 ...
随机推荐
- 修复wordpress插件编辑器漏洞
具体方法,将下面的代码添加到您的配置文件 wp-config.php中: define( 'DISALLOW_FILE_EDIT', true ); 以此关闭插件编辑器功能,一切就这么简单,漏洞也就不 ...
- (转)19 个 JavaScript 有用的简写技术
1.三元操作符 当想写if...else语句时,使用三元操作符来代替. const x = 20; let answer; if (x > 10) { answer = 'is greater' ...
- Shell Notes
查找: find: 实时查找,精确,速度慢,支持正则 find 查找路径 查找标准 查到后处理动作 查找路径默认当前目录,查找标准默认路径下所有文件,动作默认打印到屏幕 匹配标准: -name 'fi ...
- 【Oracle】修改参数的同时添加注释
当修改参数时添加注释,我们会用到如下语句: alter system set parameter=value comment='description'; --修改参数需要有相应权限的用户去执行. 例 ...
- [Intermediate Algorithm] - Sum All Odd Fibonacci Numbers
题目 给一个正整数num,返回小于或等于num的斐波纳契奇数之和. 斐波纳契数列中的前几个数字是 1.1.2.3.5 和 8,随后的每一个数字都是前两个数字之和. 例如,sumFibs(4)应该返回 ...
- windwo下载完nvm无法执行node
安装node版本管理工具之NVM.安装方法:见链接. window安装完后,下载node后,无法执行node.见图(图片从网上找的). 最后问题原因是,1.nvm安装时,安装目录中存在空格. 解决办法 ...
- 创建一个dynamics CRM workflow (二) - Build in Workflows
这里我们不着重讲解build in workflow. 但是, 如果要上手custom workflow, 我们必须要了解 build in workflow. build-in workflow 在 ...
- JS for循环的应用: 打印三角形
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 解决linux 升级高版本python3.7后yum不能使用的问题
我们linux系统一般自带python2.7 版本,但是最近项目需求必须要上python3以上,对于用惯了python2的我来说,只能硬着头皮上了.下面是我的解决办法 which yum => ...
- tsar采集数据原理
系统模块 cpu 字段含义 user: 表示CPU执行用户进程的时间,通常期望用户空间CPU越高越好. sys: 表示CPU在内核运行时间,系统CPU占用率高,表明系统某部分存在瓶颈.通常值越低越好. ...