分析
由于题意,最终我们一定可以将结果计算出来。
所以我们
1. 直接将所有合法的数字先加入到数组$a[][]$中
2. 如果为$SUM$,$STD$,$AVG$,且其范围内还有未知变量,则加入到队列$q$中
3. 不停对$q$中的元素进行判断,直到$q$中所有的元素被清空。
4. 输出最终结果$a[][]$
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
struct node{ //如果为SUM,STD,AVG,且其范围内还有未知变量,则加入到队列中
int X1,Y1,X2,Y2,posx,posy;
string op;
};
double a[N][N]; //存储结果
int n,m;
bool st[N][N]; //判断当前数是否已经被计算出来
queue<node> q;
string temp;
void eval(int x1,int y1,int x2,int y2,string OP,int X,int Y) //对三种操作的运算
{
if(OP[0]=='A') //平均值计算
{
double sum=0;
for(int j=x1;j<=x2;j++)
{
for(int k=y1;k<=y2;k++)
{
sum+=a[j][k];
}
}
sum=(double)sum/((x2-x1+1)*(y2-y1+1));
a[X][Y]=sum;
st[X][Y]=1;
}
else if(OP[1]=='U') //求和计算
{
double sum=0;
for(int j=x1;j<=x2;j++)
{
for(int k=y1;k<=y2;k++)
{
sum+=a[j][k];
}
}
a[X][Y]=sum;
st[X][Y]=1;
}
else{ //方差计算
int tot=(x2-x1+1)*(y2-y1+1);
double avg=0,sum=0;
for(int j=x1;j<=x2;j++)
{
for(int k=y1;k<=y2;k++)
{
avg+=a[j][k];
}
}
avg/=tot;
for(int j=x1;j<=x2;j++)
{
for(int k=y1;k<=y2;k++)
{
sum+=(a[j][k]-avg)*(a[j][k]-avg);
}
}
sum/=tot;
a[X][Y]=sqrt(sum);
st[X][Y]=1;
}
}
bool check(int x1,int y1,int x2,int y2) //判断当前区域中是否有未知数
{
for(int i=x1;i<=x2;i++)
{
for(int j=y1;j<=y2;j++)
{
if(!st[i][j]) return false; //该位置未计算出,返回false
}
}
return true; //所有位置都算出来了,返回true
}
void geta(int X,int Y) //对当前操作的x1,y1,x2,y2进行提取
{
int x1=0,y1=0,x2=0,y2=0,i=4;
while(temp[i]>='0' && temp[i]<='9')
{
x1=10*x1+(temp[i]-'0');
i++;
}
i++;
while(temp[i]>='0' && temp[i]<='9')
{
y1=10*y1+(temp[i]-'0');
i++;
}
i++;
while(temp[i]>='0' && temp[i]<='9')
{
x2=10*x2+(temp[i]-'0');
i++;
}
i++;
while(temp[i]>='0' && temp[i]<='9')
{
y2=10*y2+(temp[i]-'0');
i++;
}
if(check(x1,y1,x2,y2)) //该区域的所有数值都求出来了,进行计算
{
eval(x1,y1,x2,y2,temp,X,Y);
}
else{ //(x1,y1)到(x2,y2)有未知量不合法,就加入到队列q中
q.push({x1,y1,x2,y2,X,Y,temp});
}
// cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
int main()
{
cin>>n>>m;
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= m; j ++ )
{
cin>>temp;
if(temp[0]>='0' && temp[0]<='9')
{
a[i][j]=stoi(temp);
st[i][j]=1;
}
else{
if(temp[0]=='A')
{
geta(i,j);
}
else if(temp[1]=='U')
{
geta(i,j);
}
else{
geta(i,j);
}
}
}
}
while(q.size()) //一直循环到队列为空
{
auto t=q.front(); q.pop();
if(check(t.X1,t.Y1,t.X2,t.Y2))
{
eval(t.X1,t.Y1,t.X2,t.Y2,t.op,t.posx,t.posy); //合法了,进行计算
}
else{ //仍然有未知量没有求出来,继续入队
q.push(t);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%.2lf ",a[i][j]);
puts("");
}
return 0;
}