OIBH杯第三次普及组模拟赛T4 电子表格

T4:
电子表格 
题目描述
也许你用过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.在操作过程中所有单元格的值不超过2 31-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,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;
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
                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 else
                if copy(s,1,3)='sum' then
                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 else
                if copy(s,1,3)='avg' then
                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 else
                if copy(s,1,6)='output' then
                begin
                        if a[t1,t2,5]=1 then writeln(a[t1,t2,1]) else
                        begin
                                if (a[t1,t2,5]=2)or(a[t1,t2,5]=3) then
                                        writeln(sum(t1,t2)) else writeln(0);
                        end;
                end;
        end;
        close(input);close(output);
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值