• 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]='';
        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
    ",h);
            }
            else
            {
                for (int i=0;i<100;i++)
                t[i]='';
                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;
    }
  • 相关阅读:
    【XSY3309】Dreamweaver 高斯消元 拉格朗日插值
    【LUOGU???】WD与地图 整体二分 线段树合并
    【CSA49F】【XSY3317】card 博弈论 DP
    【CSA72G】【XSY3316】rectangle 线段树 最小生成树
    【CSA49G】【XSY3315】jump DP
    【集训队作业2018】【XSY3372】取石子 DP
    【LUOGU???】WD与数列 sam 启发式合并
    【LUOGU???】WD与积木 NTT
    【AGC030F】Permutation and Minimum DP
    【AGC030D】Inversion Sum DP
  • 原文地址:https://www.cnblogs.com/hrj1/p/11575721.html
Copyright © 2020-2023  润新知