版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/86685099
电子表格
题目大意:
有一个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)//sum的情况
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 //avg的情况
{
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;
}