电子表格
题目大意:
有一个Excel文档,有4中操作:input输入一个格子的值,output输出一个格子的值,sum某个格子等于一块矩形中的总值(矩形中的总值改变,这个格子也要改变),avg某个格子等于一块矩形中的水平均值(矩形中的总值改变,这个格子也要改变),输出就是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。(n,m为表格的大小,s为操作的次数)
解题思路:
这道题一看就是模拟题,模拟每一次操作,然后遇到sum或avg时,先记录起来,等要用的时候在递归回去
#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,s,x,y;
string s1,s2,s3,s4;
struct rec
{int lx,sz,x1,y1,x2,y2;
}a[105][105];
int dg(int h,int l)
{int jg=0,gs=0;if (!a[h][l].lx) return a[h][l].sz;else if (a[h][l].lx&1)for (int i=a[h][l].x1;i<=a[h][l].x2;++i)for (int j=a[h][l].y1;j<=a[h][l].y2;++j)jg+=dg(i,j);else {for (int i=a[h][l].x1;i<=a[h][l].x2;++i)for (int j=a[h][l].y1;j<=a[h][l].y2;++j)jg+=dg(i,j),gs++;jg/=gs;}return jg;
}
int main()
{freopen("excel.in","r",stdin);freopen("excel.out","w",stdout);scanf("%d %d",&m,&n);scanf("%d",&s);for (int i=1;i<=s;++i){cin>>s1>>s2;x=0;for (int c=1;c<s1.size();++c)x=x*10+s1[c]-48;y=s1[0]-65;if (s2=="input") {scanf("%d",&a[x][y].sz);a[x][y].lx=0;}if (s2=="output") printf("%d\n",dg(x,y));if (s2=="sum"){cin>>s3>>s4;a[x][y].lx=1;a[x][y].x1=0;for (int c=1;c<s3.size();++c)a[x][y].x1=a[x][y].x1*10+s3[c]-48;a[x][y].y1=s3[0]-65;a[x][y].x2=0;for (int c=1;c<s4.size();++c)a[x][y].x2=a[x][y].x2*10+s4[c]-48;a[x][y].y2=s4[0]-65;}if (s2=="avg"){cin>>s3>>s4;a[x][y].lx=2;a[x][y].x1=0;for (int c=1;c<s3.size();++c)a[x][y].x1=a[x][y].x1*10+s3[c]-48;a[x][y].y1=s3[0]-65;a[x][y].x2=0;for (int c=1;c<s4.size();++c)a[x][y].x2=a[x][y].x2*10+s4[c]-48;a[x][y].y2=s4[0]-65;}}fclose(stdin);fclose(stdout);return 0;
}