您的位置:首页 > 其它

5-9 UVA 1596 Bug Hunt找BUG

2016-01-22 22:10 351 查看
题意:

输入很多行代码,找出这些代码中第一个错误的,代码就是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: