您的位置:首页 > 其它

uva512追踪电子表格

2015-11-07 17:52 232 查看
1

做完以后提交要么Time limit,要么Runtime error,然后用重定向文件输入输出和计时器(time.h,clock),将运行时间和运行结果都导入到文件中,并没有发现超时,于是重新审题!发现书上代码里操作次数设置的超大(100000)而每个操作名字长度(<10),每个操作下的操作数(<10),题目中确实没有说会有几个操作,于是以上在代码中改掉,重新提交以后,不再显示Runtime error和Time limit。

结果提示WA,再重新审题!发现书中代码在多个实例中输出了一行空白,幡然醒悟,因为这个题目之中只有一个实例,但是大多OJ题的多个实例输出都是有一行空白(有的甚至有两行,请仔细审题),题目中确实写道:Separate output from different spreadsheets with a blank line.

竟然因为这个错误耽误了这么长时间,而且本地编译通过却OJ不过,要比想不出思路更加痛苦,谨以此为戒,好好审题,注意数据范围和输出格式。

2

两种思路,一种是模拟所有操作,将表格进行处理;另一种是记录所有操作,表格中求哪个数,就将哪个数按操作模拟一遍。做题之前两种思路都有想到,但是觉得第二种的记录操作后求哪个点再将所有操作进行一遍会耗费过多时间,然而后来看书以后,发现第二种思路在编码和运行时都比第一种要效率更高些,应该是因为操作数和查找的规模一般会小于实例中表格的规模,因此理论上将所有要查找的数操作一遍,并不会浪费太多。

3

结构体的灵活运用。第一种思路中,可以做一个二维数组,而数组中元素作为一个结构体,这样可以灵活模拟二维表格以及操作;第二种思路可以建一个一维数组的结构体,元素包括操作种类和操作位置即可。

4

有一个点要注意,每一类操作包含的若干操作位置,是针对操作前的位置而言,因此要根据之前的位置统一记录改变的位置之后再进行改变。有几种方法可以解决这个问题。第一是int dr=0;(类似dc,ir,ic),将所有操作做一遍,改变dr大小(dr++ or dr--),操作完成之后,再改变原来位置(r+=dr;),而这可直接适用于第二种思路。针对第一种思路,则相对麻烦一些,因为要考虑表格中所有的数,而不是仅仅针对所查询当前数的改变。

第二种思路AC代码:

突然断网,重新调试第一种思路代码时,第二种思路的代码给弄丢了。。先空着吧。。等我有空再补上。。。。。我要崩溃了,以后一定要好好代码再备份一遍!

——————代码如下:

#include <stdio.h>
#include <string.h>
#include <time.h>
#define maxn 10000

struct opera{
char ope_1[10];
int ope_2[10];
}opera[maxn];
int ope(int &x1,int &y1,int n1)
{
for(int i=0;i<n1;i++)
{
int dr=0;
int dc=0;
if(opera[i].ope_1[0]=='D')
{
if(opera[i].ope_1[1]=='R')
for(int l=1;l<=opera[i].ope_2[0];l++)
{
if(x1==opera[i].ope_2[l])
{
return 0;
//printf("@2:%d\n",x1);
}
else if(x1>opera[i].ope_2[l])
dr--;
//printf("@3:%d%d\n",x1,y1);
}

else
for(int l=1;l<=opera[i].ope_2[0];l++)
{
if(y1==opera[i].ope_2[l])
return 0;
else if(y1>opera[i].ope_2[l])
dc--;
}

}
else if(opera[i].ope_1[0]=='I')
{
if(opera[i].ope_1[1]=='R')
for(int l=1;l<=opera[i].ope_2[0];l++)
{
if(x1>=opera[i].ope_2[l])
dr++;
}
else
for(int l=1;l<=opera[i].ope_2[0];l++)
{
if(y1>=opera[i].ope_2[l])
dc++;
}
}
else
{
if((x1==opera[i].ope_2[0]&&y1==opera[i].ope_2[1]))
{
x1=opera[i].ope_2[2];
y1=opera[i].ope_2[3];
}
else if(x1==opera[i].ope_2[2]&&y1==opera[i].ope_2[3])
{
x1=opera[i].ope_2[0];
y1=opera[i].ope_2[1];
}
}
x1+=dr;
y1+=dc;
}

return 1;
}
int main()
{
//freopen("data.txt","r",stdin);
//freopen("printf.txt","w",stdout);
int r,c,n1,n2,x1,y1,x2,y2,kase=1;
while(scanf("%d%d%d",&r,&c,&n1)&&r)
{
memset(opera,0,sizeof(opera));
for(int i=0;i<n1;i++)
{
scanf("%s",opera[i].ope_1);
if(opera[i].ope_1[0]!='E')
{
scanf("%d",&opera[i].ope_2[0]);
for(int j=1;j<=opera[i].ope_2[0];j++)
scanf("%d",&opera[i].ope_2[j]);
}
else
for(int j=0;j<4;j++)
scanf("%d",&opera[i].ope_2[j]);
}
scanf("%d",&n2);
if(kase>1)
printf("\n");
printf("Spreadsheet #%d\n", kase++);
while(n2--)
{
scanf("%d%d",&x1,&y1);
//printf("@1:%d/n",x1);
int x2=x1,y2=y1;
if(!ope(x1,y1,n1))
printf("Cell data in (%d,%d) GONE\n", x2, y2);
else
printf("Cell data in (%d,%d) moved to (%d,%d)\n", x2, y2, x1, y1);

}
}
//printf("Time used=%2.3f\n",(double)clock()/CLOCKS_PER_SEC);
}


第一种思路代码在调试。

先这样吧--
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: