P2830 写程序

题目背景

zrz在写程序,他叫你帮他看看他的程序有没有问题。

题目描述

有一个若干行的程序,每一行只有一个命令,可能出现的命令有一下几种

int a[maxn] 声明一个数组,开头一定是int,不会是别的什么longlong之类的,a是指一个数组的名称(不一定是a,也有可能是别的字母或者多个字母,总之长度不超过10),后面是一个中括号和一个数字或一个变量,表示数组大小(从0到maxn-1,maxn<=100),数组声明之后里面的数均为0。

a[i] h 把h赋给a[i](也就是a[i]=h),同样h可能是一个数字或者是一个变量,i代表一个数字或者是一个变量。

cout h 输出h,h一定是个变量。

输入格式

若干行:每行一个命令

输出格式

对于每一个输出的命令(即cout),输出一行。如果在某一行发现有数组下标越界(切记,只可能出现这种错误,不会出现别的比如重定义之类的问题),不管是哪个命令,都要立即停止,无论下面有多少行命令都忽略,并输出-1。

输入输出样例

输入 #1
int a[10]
a[a[0]] 2
cout a[0]
输出 #1
2
输入 #2
int a[10]
a[0] 10
cout a[0]
a[a[0]] 1
cout a[0]
输出 #2
10
-1

说明/提示

行数不会太多的,变量可能嵌套,如 a[a[b[0]]]等等,也有可能出现大写字母,所有的出现的数字不会超过10^9,也不会是负数,更不会是小数。

 

 

疯狂模拟,注意细节处理,判断变量嵌套的时候可以用递归完成,顺便判断是否合法

 

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
using namespace std;
char s[100][10],a[100],b[100],t[100];
int l[100],p[100][100],y,w,ww,h,hh;
int zsy(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=zsy(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=zsy(b,w+1,strlen(b)-2);
            if (h==-1){printf("-1");return 0;}
            l[y++]=h;
        }
        else if (!strcmp(a,"cout"))
        {
            h=zsy(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=zsy(a,w+1,strlen(a)-2);
            if(h==-1 || h>=l[ww]){
                printf("-1");
                return 0;
            }
            hh=zsy(b,0,strlen(b)-1);
            if (hh==-1){
                printf("-1");
                return 0;
            }
            p[ww][h]=hh;
        }
    }
    return 0;
}

 

posted @ 2019-09-23 23:48  魂兮龙游  阅读(177)  评论(0编辑  收藏  举报