UVa 1596 Bug Hunt (string::find && map && 模拟)
题意 : 给出几组由数组定义与赋值构成的编程语句, 有可能有两种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 && 模拟)的更多相关文章
- 【技巧性(+递归运用)】UVa 1596 - Bug Hunt
In this problem, we consider a simple programming language that has only declarations of onedimensio ...
- uva 1596 Bug Hunt
In this problem, we consider a simple programming language that has only declarations of one-dimensi ...
- UVA 1596 Bug Hunt (大模拟 栈)
题意: 输入并模拟执行一段程序,输出第一个bug所在的行. 每行程序有两种可能: 数组定义: 格式为arr[size]. 例如a[10]或者b[5],可用下标分别是0-9和0-4.定义之后所有元素均为 ...
- UVa 1596 Bug Hunt (STL栈)
题意:给定两种操作,一种是定义一个数组,另一种是赋值,让你找出哪一步时出错了,出错只有两种,一种是数组越界,另一种是访问未定义变量. 析:当初看到这个题时,感觉好麻烦啊,然后就放过去了,而现在要重新回 ...
- 【UVA】1596 Bug Hunt(模拟)
题目 题目 分析 算是个模拟吧 代码 #include <bits/stdc++.h> using namespace std; map<int,int> a[ ...
- 【习题 5-9 UVA - 1596】Bug Hunt
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] map模拟 map<string,int>记录每个数组的大小 map <pair<string, int&g ...
- [刷题]算法竞赛入门经典(第2版) 5-9/UVa1596 - Bug Hunt
//开学了,好烦啊啊啊啊啊!怎么开个学那么多破事情!!都俩星期了,终于有时间写出来一道题 题意:不难理解,不写了.这几天忙的心累. 代码:(Accepted, 0.010s) //UVa1596 - ...
- HDU 4287 Intelligent IME(string,map,stl,make_pair)
题目 转载来的,有些stl和string的函数蛮好的: //numx[i]=string(sx); //把char[]类型转换成string类型 // mat.insert(make_pair(num ...
- Apollo 中配置String、Map和List和默认值
摘要:在Apollo 中,配置String.Map和List等类型的信息,同时设置默认值. 综述 随着业务需求的变更,需要在Apollo中配置一个Map<String, List>类型 ...
随机推荐
- 【转帖】docker 部署vsftpd服务
docker 部署vsftpd服务 https://blog.csdn.net/ctwy291314/article/details/82012860 转帖学习一下 docker部署vsftpd服务 ...
- CPU飙高,频繁GC,怎么排查?
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警. 本文主要针对系统运行缓慢 ...
- Redis 3主-3从集群的搭建(CentOS 7)
注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...
- gcc数据对齐之: howto 2.
原文链接:http://www.catb.org/esr/structure-packing/ 谁应阅读本文 本文探讨如何通过手工重新打包C结构体声明,来减小内存空间占用.你需要掌握基本的C语言知识, ...
- C# ref out parase 理解
这节课我们来学习方法中的参数传递,在面向对象二中,我曾说过,参数也属于变量的一种,在c语言的学习时,同学们都学习过参数这个概念和用法,方法使用参数列表来传递变量的基本语法如下:returnType ...
- httpClient4.5.2工具类总结
使用背景: 因项目使用非结构化存储,http相关jar包统一升级到httpClient4.5.2,查阅相关文档总结如下,以咨分享,望不吝指教. 依赖jar包 httpclient-4.5.2.jar. ...
- vuex的简单理解
初次接触vuex,谈谈我自己的理解.有待后期改进 首先要知道,Vuex 是专门为 Vue.js 设计的状态管理库.我们知道在用vue.js进行前端项目开发时,会出现很多组件相互之间调用属性.状态,小项 ...
- openlayers 添加标记点击弹窗 定位图标闪烁
环境vue3.0 ,地图为公用组件,将添加图标标记的方法放在公共地图的初始化方法里 同一时间弹窗和定位标识都只有一个,因而我把弹窗和定位标记的dom预先写好放到了页面 //矢量标注样式设置函数,设置i ...
- 利用wampserve搭建本服务器
1.官网下载安装包 注意:3.0.6版本需要下载依赖包vc依赖包 2.默认为英文 右击图标进入langue设置为中文 3.需要手动设置在现状态 右击=>选中wampsetting =>me ...
- sqlite3中 timestamp使用
timestamp使用 一. timestamp两种属性:自动初始化: 此行为只在第一次写入数据时,怎么把时间设为当前时间. (DEFAULT CURRENT_TIMESTAMP)自动更新: 此行为在 ...