博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1596:Bug Hunt
阅读量:6302 次
发布时间:2019-06-22

本文共 2702 字,大约阅读时间需要 9 分钟。

我的思路:对于每行code,若无等号,直接初始化数组即可,否则依次检查等号左边和右边的表达式是否正确。对于左边的表达式,只需检查到首个数组之前即可,因为可能要对其初始化;对于右边表达式则要全部检查。

对于复合表达式要如何检查呢?我的做法是先找出数字下标,确定其最内层数组,然后依次向外找出外层数组。

此外还有一些小细节需要特别注意,这次是一次AC,开心。具体代码如下:

#include
#include
#include
using namespace std;map
>arrset; //记录每个数组初始化后的元素map
arrsize; //记录数组的sizeint findDigit(string& s,int rp){    int i = rp; //右边起始点在等号后面一位    while(!isdigit(s[i])) i++;    return i;}int stod(string& s,int i){    int r = 0;    while(s[i] && isdigit(s[i])){ r = r*10 + s[i] - '0'; i++; }    return r;}int findArr(string& s,int ae){    while(ae >= 0 && s[ae] != '[' && s[ae] != '=') ae--; //检查右边的话结束标志是'='    return ae + 1;}int main(){    string s,arr,arr2;    while(getline(cin,s) && s[0] != '.'){        arrset.clear();        arrsize.clear();        int bugline = 0,cnt = 0;        while(s[0] != '.'){            if(bugline){ getline(cin,s);continue; }            cnt++;            int dp = findDigit(s,0); //出现数字下标的位置            int index = stod(s,dp);            if(s.find('=') == string::npos){                arrsize[s.substr(0,dp-1)] = index;                getline(cin,s);                continue;            }            int as,ae = dp - 2; //arr名字起点和终点下标            as = findArr(s,ae);            arr = s.substr(as,ae - as + 1);            while(as >= 0){ //检查左边                if(index >= arrsize[arr] || (as && !arrset[arr].count(index))){ //如果是首个数组的话不需要检查元素是否初始化                    bugline = cnt;                    cout<
<
= rp){ //检查右边                if(index2 >= arrsize[arr2] || !arrset[arr2].count(index2)){                    bugline = cnt;                    cout<
<

看了别人的代码发现其实题目中说数组名是单个字符而不是字符串,修改如下:

#include
using namespace std;map
>arrset; //记录每个数组初始化后的元素map
arrsize; //记录数组的sizeint findDigit(string& s,int rp){ int i = rp; //右边起始点在等号后面一位 while(!isdigit(s[i])) i++; return i;}int stod(string& s,int i){ int r = 0; while(s[i] && isdigit(s[i])){ r = r*10 + s[i] - '0'; i++; } return r;}int main(){ string s; char arr,arr2; while(getline(cin,s) && s[0] != '.'){ arrset.clear(); arrsize.clear(); int bugline = 0,cnt = 0; while(s[0] != '.'){ if(bugline){ getline(cin,s);continue; } cnt++; int dp = findDigit(s,0); //出现数字下标的位置 int index = stod(s,dp); int ap = dp - 2; //arr名的位置 arr = s[ap]; if(s.find('=') == string::npos){ arrsize[arr] = index; getline(cin,s); continue; } while(ap >= 0){ //检查左边 if(index >= arrsize[arr] || (ap && !arrset[arr].count(index))){ //如果是首个数组的话不需要检查元素是否初始化 bugline = cnt; cout<
<
= rp){ //检查右边 if(index2 >= arrsize[arr2] || !arrset[arr2].count(index2)){ bugline = cnt; cout<
<

转载于:https://www.cnblogs.com/JingwangLi/p/10202725.html

你可能感兴趣的文章
打造一个上传图片到图床利器的插件(Mac版 开源)
查看>>
iOS横竖屏
查看>>
thinkphp判断更新是否成功
查看>>
Do While ... Loop 与 Do Until ... Loop 的区别
查看>>
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
【HDOJ】5046 Airport
查看>>
Mysql全文索引
查看>>
C++ primer->16.2 模板实参推断
查看>>
Java核心技术卷1——第四章下
查看>>
虚拟机字节码执行引擎
查看>>
高斯消元法
查看>>
linux就该这么学第十一课-网络配置4种方法,网卡聚合
查看>>
PHP 数组
查看>>
软件架构师工作内容总结
查看>>
机智的MySQL优化器 --- is null
查看>>
python bool值要注意的一些地方
查看>>
vuex使用mapActions报错解决办法
查看>>
vb 坐标点击
查看>>