题解 P2830 【写程序】
1124828077ccj · · 题解
疯狂模拟,注意细节处理,判断变量嵌套的时候可以用递归完成,顺便判断是否合法
附上代码(函数名是我的名字哦,所以别抄代码哈)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
using namespace std;
char s[100][100],a[100],b[100],t[100];
int l[100],p[100][100],y,w,ww,h,hh;
int ccj(string r,int x,int yy){
if (r[x]>='0' && r[x]<='9')
{
int uuu=0;
for (int i=x;i<=yy;i++)
uuu=uuu*10+r[i]-'0';
return uuu;
}
int www,e;
char m[100];
for (int i=0;i<100;i++)
m[i]='\0';
for (int i=x;r[i]!='[';i++,www=i)
m[i-x]=r[i];
for (int i=0;i<y;i++)
if (!strcmp(m,s[i])){e=i;break;}
int j=ccj(r,www+1,yy-1);
if (j==-1 || j>=l[e])return -1;
return p[e][j];
}
int main()
{
while(scanf("%s%s",a,b)==2)
{
if (!strcmp(a,"int"))
{
for (int i=0;b[i]!='[';i++,w=i)
s[y][i]=b[i];h=ccj(b,w+1,strlen(b)-2);
if (h==-1){printf("-1");return 0;}
l[y++]=h;
}
else if (!strcmp(a,"cout"))
{
h=ccj(b,0,strlen(b)-1);
if (h==-1){printf("-1");return 0;}
printf("%d\n",h);
}
else
{
for (int i=0;i<100;i++)
t[i]='\0';
for (int i=0;a[i]!='[';i++,w=i)
t[i]=a[i];
for (int i=0;i<y;i++)
if (!strcmp(t,s[i])){ww=i;break;}
h=ccj(a,w+1,strlen(a)-2);
if (h==-1 || h>=l[ww]){printf("-1");return 0;}
hh=ccj(b,0,strlen(b)-1);
if (hh==-1){printf("-1");return 0;}
p[ww][h]=hh;
}
}
return 0;
}