T4:
每次有新的定义时直接计算该单元格的值是错误的,
因为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.