题意 : 给出几组由数组定义与赋值构成的编程语句, 有可能有两种BUG, 第一种为数组下标越界, 第二种为使用尚未定义的数组元素, 叫你找出最早出现BUG的一行并输出, 每组以' . '号分隔, 当有两组输入都是' . '时结束程序

分析 : 由于错误的类型由题意所述的两种组成, 所以我们需要知道每个数组的长度每个已经被赋值定义过的数组元素大小, 因此可以定义map<string, int> Info 来存储数组名和这个数组的大小两个信息, 在定义一个map<string, map<int, int>> arr 来储存数组内某个元素的具体的值。由于每一行的语句可以很复杂, 类似 a[B[a[0]]]=a[B[0]] 这样, 所以需要分步处理!这里的解决方案步骤如下, 都以 c[B[a[0]]]=a[B[0]] 为例

1、如果为定义语句, 则直接进行模拟和存储即可

2、如果为赋值语句,则将其按等于号分为左右两部分进行处理 (即 c[B[a[0]]] 和 a[B[0]] )

3、提取出左部分并且分为将要被赋值的数组名 和 其[  ]内的内容  (即 c 和 B[a[0]] )

4、提取出右部分全部 (即 a[B[0]])

5、如果需要处理的数组下标, 即[ ]里的元素就是数字的话则直接判断是否存在题目所述的两种BUG, 不存在则模拟正常存储过程

6、如果[ ]元素还是嵌套的数组, 可以发现这种情况的处理方法都是从里往外一个个全部找BUG并且转成对应的数字, 符合递归思想, 因此可以写一个递归模块check()来提取

7、将第三步提取出的[ ]中的内容丢进check()进行查错和转化 (即 check( B[a[0]] )

8、将第四步提取出的内容同样丢进check()进行查错和转化

9、若所有的check()都没毛病, 则复杂的语句将会变成——>数组名[数字] = 数字  这种形式, 进行模拟存储即可

技巧 : 其中有些操作可能会比较麻烦, 下面介绍几个函数

1、字符的分部可以使用string::find_first_of( 元素 )函数, 其返回的是在string中第一次找到元素的位置 和 string::substr(begin, len)来解决

2、判断语句是否有' = '号可以使用string::find(), 如果 其!=string::npos则说明存在

瞎搞 : 在做这种模拟题前需要仔细斟酌, 否则打出来之后可能花了很多时间却发现了重大的错误, 并且需要多想用什么进行存储能方便操作, 还有尽量进行模块化编程, 否则打出来后一旦出现BUG, 对着又长又臭的代码, 改错难度肯定很大!因此三思而后行啊!

#include<bits/stdc++.h>
#define in 0
#define out 0
using namespace std;
map<string, int> info;
map<string, map<int, int> > arr;
bool Error; // check中的标志,如果为true则说明已经存在BUG
int check(string s)
{
    ])){
        stringstream num(s);
        int k;
        num>>k;
        return k;
    }else{
        , s.find_first_of();
        , s.find_first_of('['));
        int index = check(Inner);
        ){
            Error = true;
            ;
        }else{
            if(index>=info[name]){
                Error = true;
                ;
            }else{
                if(!arr[name].count(index)){
                    Error = true;
                    ;
                }else{
                    return arr[name][index];
                }
            }
        }
    }
}
bool solve()
{
    Error = false;
    string temp;
    ;//记录行数
    ;//记录错误的行数
    while(cin>>temp){
        ]=='.'){
            if(!line) return false;
            else{
                info.clear();
                arr.clear();
                printf("%d\n", error_line);
                return true;
            }
        }
        ) continue;//如果已经找到错误的行数, 没必要进行下去
        line++;
        if(temp.find('=') != string::npos){
            , temp.find_first_of('='));
            );
            , Left.find_first_of('['));
            , Right.find_first_of('['));
            , Left.find_last_of();
            int L = check(InA);//丢进check进行数字的转化
            int R = check(Right);
            if(Error){//上面进行check后如果Error为true则说明找到BUG
                error_line = line;
            }else{
                if(!info.count(A)){
                    error_line = line;
                }else{
                    map<int, int> temp2;
                    ){
                        error_line = line;
                    }else{
                        if(!arr.count(A)){
                            temp2[L] = R;
                            arr[A] = temp2;
                        }else{
                            arr[A][L] = R;
                        }
                    }
                }
            }
        }else{
            , temp.find_first_of('['));
            , temp.find_first_of();
            stringstream num(index);
            int len;
            num>>len;
            info[name] = len;
        }
    }
}
int main(void)
{
    #if in
        freopen("in.txt", "r", stdin);
    #endif
    #if out
        freopen("out.txt", "w", stdout);
    #endif
    while(solve()){}
    ;
}

UVa 1596 Bug Hunt (string::find && map && 模拟)的更多相关文章

  1. 【技巧性(+递归运用)】UVa 1596 - Bug Hunt

    In this problem, we consider a simple programming language that has only declarations of onedimensio ...

  2. uva 1596 Bug Hunt

    In this problem, we consider a simple programming language that has only declarations of one-dimensi ...

  3. UVA 1596 Bug Hunt (大模拟 栈)

    题意: 输入并模拟执行一段程序,输出第一个bug所在的行. 每行程序有两种可能: 数组定义: 格式为arr[size]. 例如a[10]或者b[5],可用下标分别是0-9和0-4.定义之后所有元素均为 ...

  4. UVa 1596 Bug Hunt (STL栈)

    题意:给定两种操作,一种是定义一个数组,另一种是赋值,让你找出哪一步时出错了,出错只有两种,一种是数组越界,另一种是访问未定义变量. 析:当初看到这个题时,感觉好麻烦啊,然后就放过去了,而现在要重新回 ...

  5. 【UVA】1596 Bug Hunt(模拟)

    题目 题目     分析 算是个模拟吧     代码 #include <bits/stdc++.h> using namespace std; map<int,int> a[ ...

  6. 【习题 5-9 UVA - 1596】Bug Hunt

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] map模拟 map<string,int>记录每个数组的大小 map <pair<string, int&g ...

  7. [刷题]算法竞赛入门经典(第2版) 5-9/UVa1596 - Bug Hunt

    //开学了,好烦啊啊啊啊啊!怎么开个学那么多破事情!!都俩星期了,终于有时间写出来一道题 题意:不难理解,不写了.这几天忙的心累. 代码:(Accepted, 0.010s) //UVa1596 - ...

  8. HDU 4287 Intelligent IME(string,map,stl,make_pair)

    题目 转载来的,有些stl和string的函数蛮好的: //numx[i]=string(sx); //把char[]类型转换成string类型 // mat.insert(make_pair(num ...

  9. Apollo 中配置String、Map和List和默认值

    摘要:在Apollo 中,配置String.Map和List等类型的信息,同时设置默认值. 综述   随着业务需求的变更,需要在Apollo中配置一个Map<String, List>类型 ...

随机推荐

  1. 微信小程序--catchtap&bindtap

    转自:https://www.cnblogs.com/heron-yu/p/7244481.html 转自:http://blog.csdn.net/xiaochun365/article/detai ...

  2. mongodb增删改查常用命令总结

    前言 去年我还折腾过mongodb,后来用不到也就没碰了,这就导致了我忘的一干二净,不得不感叹,编程这东西只要不用,就会忘没了.现在我想重拾mongodb,来总结一下常用命令,主要就是增删改查. 另外 ...

  3. 實現QQ第三方登錄

    <?php // 写几个函数,分别用于获取code,token,openid,用户信息 // 跳转到QQ授权登录页面 function code(){ $response_type='code' ...

  4. 使用Koa.js离不开这十个中间件

    随着ES6的普及,async/await的语法受到更多JS开发者的青睐,Koa.js作为比较早支持使用该语法的Node框架越来越受到大家的喜爱,虽然Koa.js本身支持的功能很有限,但官方和社区提供了 ...

  5. Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/34430283 题目链接:点击打开链接 题意 ...

  6. vim下使用UltiSnips

    vim下使用UltiSnips 最近在学习Linux编程,相应的也在学vim.vim中的UltiSnips插件可以实现比一般的代码补全更为强大的效果.这里就记录一下吧. UltiSnips安装.基础及 ...

  7. knative 安装

    knative 安装 本文安装版本 knative 0.6. 准备 安装 knative 前需要事先安装 Kubernetes 集群 和 Istio. 安装 下载安装所需要的文件.以下选择的是全安装, ...

  8. css练习小总结

    1.div水平居中:/*设置div宽度后,margin:0 auto:*/2.div显示在一行:/*float:left:*/ 3.text-align:/*后面标签里的内容水平居中:*/4.alig ...

  9. Django 解决跨域问题(写入到中间件中)

    class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_respon ...

  10. Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)

    链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...