1596 - Bug Hunt【STL】

一道比较简单的STL练习题。

开2个map 一个存数组大小,一个map<string,map<int,int>>存数组的元素是否存在以及值

输入不存在负数的情况,纯代码题

#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<string>
#include<queue>
#include<iostream>
#include<stack>
using namespace std;
const int maxn = 101;
char str[maxn];
int cases = 1;
int ans   = 0;
map<string,int>arr_size;        //数组的大小
map<string,map<int,int> >arr;   //数组的元素
int dfs(char *s,int a,int b){
    char name[maxn];
    int pos = 0;
    for(int i = a; i < b; i++){
        if(s[i] != '[')
            name[pos++] = s[i];
        else{
            int e = dfs(s,i + 1,b - 1);     //数组下标
            if(e < 0) return -1;
            string sstr(name,0,pos);        //数组名称
            int ssize = arr_size[sstr];     //数组大小
            if(ssize < e) return -1;
            if(!arr[sstr].count(e))
                return -1;
            return arr[sstr][e];
        }
    }
    int re = 0;
    for(int i = 0; i < pos; i++)
        re = re * 10 + name[i] - '0';
    return re;
}
//鉴定语句
int judge(char *s,int l){
    int value = 0,pos = 0;
    char name[maxn];
    for(int i = 0; i < l; i++){
        if(s[i] == '=')
            return i;           //返回等号的位置
        else if(s[i] >= '0' && s[i] <= '9')
            value = value * 10 + s[i] - '0';
        else if(s[i] != '[' && s[i] != ']')
            name[pos++] = s[i];
    }
    string na(name,0,pos);
    arr_size[na] = value;
    return -1;
}
bool solve(char *str){
    char name[maxn];
    int  pos = 0;
    int  L   = strlen(str);
    int  op  = judge(str,L);
    if(op >= 0){
        pos = 0;
        for(int i = 0; i < L; i++)
            if(str[i]!= '[') name[pos++] = str[i];
            else break;
            int e1 = dfs(str,pos + 1,op - 1);
            int e2 = dfs(str,op  + 1,L);
            string my(name,0,pos);
            int ssize = arr_size[my];
            if(e1 == -1 || e2 == -1 || e1 >= ssize)
                if(!ans) ans = cases;
            else
                arr[my][e1] = e2;
    }
}
int main(){
    while(scanf("%s",str) && str[0] != '.'){
        cases = 1;
        ans = 0;
        arr_size.clear();
        arr.clear();
        solve(str);
        while(scanf("%s",str) && str[0] != '.'){
            cases ++;
            solve(str);
        }
        printf("%d\n",ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值