【模拟】【递归】电子表格(jzoj 2127)

版权声明:欢迎借鉴,谢绝抄搬。 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;
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/86685099
今日推荐