您的位置:首页 > 其它

2017.1.13【初中部 】普及组模拟赛C组 excel 电子表格 题解

2017-01-13 22:16 239 查看

原题:

http://172.16.0.132/junior/#contest/show/1363/3

题目描述:

也许你用过Microsoft Excel之类的电子制表软件,这类软件最令人称道的就是强大的公式计算功能。现在希望你也来实现一个具有最基本功能的电子制表软件。表格共有m列(0 < m • 26),从左到右依次用A到Z的大写英文字母表示;有n行(0 < n <100),从上到下依次用1到100的整数表示。这样,每一个单元格的位置就可以唯一地用它所在的列和行表示出来,例如从左到右第3列,从上到下第5行的单元格就可以用“ C5”来表示(注意,这里字母和数字中间没有空格)。

现在对表格进行了一系列的操作,这些操作主要就是赋值和查询。定义操作的输入规则

如下:

1.每个操作占一行,根据操作类型的不同,每行中可能有二至四个用空格隔开的“单词”;

2.每行的第一个单词指定了该操作涉及的单元格的位置;

3.每行的第二个单词指定了相应的操作,可能是: input,output,sum,avg

(1).如果第二个单词是input,表示接下来的一个整数是要赋予该单元格的值,这个值是

不超过1000的正整数

(2).如果第二个单词是output,表示你需要在输出文件中输出这个单元格当前的值

(3).如果第二个单词是sum,表示接下来输入的两个单词定义了一个矩形区域,该单元格的值就应该恒为这个矩形区域中所包含的单元格的值的和,直到该单元格被重新定义

(4).如果第二个单词是avg,表示接下来输入的两个单词定义了一个矩形区域,该单元格的值就应该恒为这个矩形区域中所包含的单元格的值的算术平均数,直到该单元格被重新定义;

4.“输入的两个单词定义了一个矩形区域”是指输入一个矩形区域的左上角和右下角的单元格的位置,这样就唯一确定了这个矩形区域;

5.所有时刻,每个单元格的值均为整数,如果不是,则向下取整;

6.如果某个单元格的值没有在上文定义,则它的值默认为0;

7.不会出现循环定义的情况;

8.在操作过程中所有单元格的值不超过231-1。

输入:

第一行输入两个用空格隔开的正整数m和n,分别代表表格的列数和行数。

第二行输入一个正整数s,表示操作的总数。

以下s行每行输入一个操作,具体格式参见问题描述。

输出:

对于输入数据的每一个“ output”操作输出一行结果。因此,输出文件的行数等于输入文

件中“ output”操作的个数。

样例输入:

3 5

5

A1 input 100

B2 input 200

C3 sum A1 C2

C5 avg B2 C4

C5 output

样例输出:

83

数据范围限制:

对于30%的数据, m; n; s <= 10;

对于100%的数据, m <= 26, n < =100, s <=100。

分析:

题目描述不复杂,但是看起来很繁琐。因此,本题很考察选手的细心程度。由于规模很小,本题也不需要什么高级数据结构,只需要按照题意操作即可。

对于具体的实现方式,各人有不同的方法。每次有新的定义时直接计算该单元格的值是错误的,因为sum 和avg 的单元格必须随时更新(题目说明了这样的单元格必须恒等于要求的数值和或平均数)。我的方法是,每次有新的单元格被定义后,递归地计算出每个格子的值;如果计算过程中遇到某个由sum 或avg 定义的单元格,递归地调用它。储存下已经计算出的格子的值(相当于记忆化搜索)可以防止重复运算,提高效率。由于不会出现循环定义,因此该递归过程总有结束的时候。

实现:

var
n,m,i,j,k,l
4000
,t1,t2,t3,t4,t5,t6,p:longint;
a:array[1..100,1..100,1..5]of longint;
s:string;
function sum(x,y:longint):longint;
var
i,j:longint;
begin
if a[x,y,5]=0 then exit(0);
if a[x,y,5]=1 then exit(a[x,y,1]);
sum:=0;
for i:=a[x,y,1]  to a[x,y,3] do
for j:=a[x,y,2] to a[x,y,4] do
sum:=sum+sum(i,j);
if a[x,y,5]=2 then exit(sum) else exit(sum div ((a[x,y,3]-a[x,y,1]+1)*(a[x,y,4]-a[x,y,2]+1)));
end;
procedure dy1;
begin
delete(s,1,6);
val(s,p);
fillchar(a[t1,t2],sizeof(a[t1,t2]),0);
a[t1,t2,5]:=1;
a[t1,t2,1]:=p;
end;
procedure dy2;
begin
a[t1,t2,5]:=2;
delete(s,1,4);
t4:=ord(s[1])-64;
for i:=1 to length(s) do
if s[i]=' ' then
begin
j:=i;
break;
end;
val(copy(s,2,j-2),t3);
delete(s,1,j);
t6:=ord(s[1])-64;
delete(s,1,1);
val(s,t5);
a[t1,t2,1]:=t3;
a[t1,t2,2]:=t4;
a[t1,t2,3]:=t5;
a[t1,t2,4]:=t6;
end;
procedure dy3;
begin
a[t1,t2,5]:=3;
delete(s,1,4);
t4:=ord(s[1])-64;
for i:=1 to length(s) do
if s[i]=' ' then
begin
j:=i;
break;
end;
val(copy(s,2,j-2),t3);
delete(s,1,j);
t6:=ord(s[1])-64;
delete(s,1,1);
val(s,t5);
a[t1,t2,1]:=t3;
a[t1,t2,2]:=t4;
a[t1,t2,3]:=t5;
a[t1,t2,4]:=t6;
end;
procedure dy4;
begin
if a[t1,t2,5]=1 then writeln(a[t1,t2,1])
else
if (a[t1,t2,5]=2)or(a[t1,t2,5]=3) then writeln(sum(t1,t2))
else writeln(0);
end;
begin
assign(input,'excel.in');reset(input);
assign(output,'excel.out');rewrite(output);
readln(m,n);
readln(l);
for k:=1 to l do
begin
readln(s);
t2:=ord(s[1])-64;
for i:=1 to length(s) do
if s[i]=' ' then
begin
j:=i;
break;
end;
val(copy(s,2,j-2),t1);
delete(s,1,j);
if copy(s,1,5)='input' then dy1;
if copy(s,1,3)='sum' then dy2;
if copy(s,1,3)='avg' then dy3;
if copy(s,1,6)='output' then dy4;
end;
close(input);close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: