5-9 UVA 1596 Bug Hunt找BUG

来源:互联网 发布:淘宝网必须实名认证吗 编辑:程序博客网 时间:2024/05/30 04:28

题意:

输入很多行代码,找出这些代码中第一个错误的,代码就是C语言中的数组建立,数组元素的赋值。多组数据用'点'隔开,最后以点结束。


好恶心的题,只要类似这种,字符串操作的题目,我都会反感,但没办法,只能耐住性子一点一点找了一下午BUG(T T),

越是复杂的题目就得写的越规范,所以可以尝试采用紫书之前提到的“自顶向下,逐步求精”的方法。

因为自己在写的过程中,没想整体思路,而是一步一步的写的,导致自己越写越不规范,导致浪费了太多时间!


思路:

代码整体分为两类:

一是建立数组(字符串中没有等号),而是赋值,中间有等号,

所以,我建立了一个结构体数组,当作数组,里面有siz代表数组大小,还有一个map<int,int>代表数组元素键和键值。

建立数组,就是结构体初始化的过程!

赋值就是给map加入东西的过程!

建立数组的代码肯定是正确的,直接建立。关键是赋值,把等号分割开,左边一部分,右边一部分,分别处理。


自己的代码自己都不想看了,写的比较丑,相当于硬凑出来的!


代码如下:


#include<string>#include<cstring>#include<algorithm>#include<iostream>#include<map>#include<cstdio>#include<vector>#include<sstream>using namespace std;const int maxn = 1000 + 5;map<string,int>id;vector<string>result[2];int resul,res2,cnt_id=0;struct vars{    int siz;    map<int,int>value;}var[maxn];int to_digt(const string &s){    int v =0;    for (int i = 0; i < (int)s.size(); ++i)v=v*10+s[i]-48;    return v;}int solve2(string s,int way){    for(int i = 0; i < (int)s.size(); ++i)if (s[i]=='['||s[i]==']')s[i]=' ';    stringstream ss(s);    vector<string>String;String.clear();    string code;    while(ss >> code)String.push_back(code);    int val=to_digt(String[String.size()-1]),val_flag=to_digt(String[String.size()-1]);    if (String.size()==1){res2=val;return 1;}    for (int i=String.size()-1; i > 0; --i){        string str = String[i-1];int idd= id[str];        if(var[idd].siz <= val) return false;        if (way==2){if (!var[idd].value.count(val))return false;}        else {if (i>1 && !var[idd].value.count(val))return false;}        val = var[idd].value[val];        if (i>1)val_flag=val;    }    result[0].clear();result[1].clear();    if (way==1){resul=val_flag;result[0].push_back(String[0]);}    else res2=val;    return true;}int solve(string s){    int m = s.find("=");    if (m == -1){        int m1=s.find("["),m2=s.find("]");        string s1=s.substr(0,m1),s2=s.substr(m1+1,m2-2);        id[s1]=++cnt_id;        var[id[s1]].siz=to_digt(s2);        return 1;    }else{        string bef=s.substr(0,m);        string aft=s.substr(m+1);        int a2=solve2(aft,2),a1=solve2(bef,1);        if(a1 && a2){            int val =res2;            var[id[result[0][0]]].value[resul]=val;// fuzhi            return 1;        }return 0;    }}int main(){    string s,t;    int cnt_cont=0;    while(cin >> s && s != "."){        bool bug=false;        if(!bug)++cnt_cont;        if (!bug)if (!solve(s))bug=true;        while(cin >> t && t != "."){            if (!bug)++cnt_cont;            if (!bug)if (!solve(t))bug=true;        }        if (!bug)printf("0\n");        else printf("%d\n",cnt_cont);        cnt_cont=0;    }    return 0;}


0 0
原创粉丝点击