关于OIBH杯第三次模拟赛(普及组)Problem 4 : excel 电子表格 的福利

题目描述

也许你用过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。

 

介个是一道灰常繁琐的强模拟——话不多说,既然是福利,就直接上程序(不要问我程序是谁):

var
        a:array ['A'..'Z',1..100,1..4] of longint;
        b:array ['A'..'Z',1..100,1..2] of char;
        ch,k,x,n:char;
        i,m,s,y,t:longint;
function js(x:char;y:longint):longint;
var
        i:char;
        j:longint;
        s:real;
begin
        case a[x,y,1] of
                0:exit(0);
                1:exit(a[x,y,2]);
                else begin
                        s:=0;
                        for i:=b[x,y,1] to b[x,y,2] do
                                for j:=a[x,y,2] to a[x,y,3] do
                                        s:=s+js(i,j);
                        if a[x,y,1]=3 then exit(trunc(s/a[x,y,4])) else exit(trunc(s));
                end;
        end;
end;
begin
        assign(input,'excel.in'); reset(input);
        assign(output,'excel.out'); rewrite(output);
        read(m); n:=chr(m+64); readln(m); readln(s);
        for t:=1 to s do
        begin
                read(x,y); read(k); read(ch);
                case ch of
                        'i':begin
                                for i:=1 to 5 do
                                        read(k);
                                readln(a[x,y,2]);
                                a[x,y,1]:=1;
                        end;
                        'o':begin
                                readln;
                                writeln(js(x,y));
                        end;
                        else begin
                                for i:=1 to 3 do
                                        read(k);
                                readln(b[x,y,1],a[x,y,2],k,b[x,y,2],a[x,y,3]);
                                if ch='s' then a[x,y,1]:=2 else begin
                                        a[x,y,1]:=3;
                                        a[x,y,4]:=(ord(b[x,y,2])-ord(b[x,y,1])+1)*(a[x,y,3]-a[x,y,2]+1);
                                end;
                        end;
                end;
        end;
        close(input); close(output);
end.
顺便讲一下,介个强模拟有技巧,就是对于非常数的格子,要在递归里面求。(介样省时省力)

你可能感兴趣的:(综合,Pascal,excel,OJ,福利)