Uva 1596 - Bug Hunt

BugHunt小游戏源代码分享 一款很不错的C++入门者可以设计的游戏<br>我把源代码也给大家分享哈 嘻嘻 立即下载

一.题目

题目链接:Uva1596


二.思路

因为涉及到多个数组的嵌套,两个最近的[]是一对,先进先出,因此很明显是要用到栈的。我是用双栈来完成嵌套数组的处理的,核心思想就是从最里层的数组开始,计算出它的下标和数组名,判断是否有错误,有错误直接返回,没错误就继续让当前数组名该下标下的值成为下一个下标,然后获取新的数组名,直到栈空。数组的存储我是用map<string,map<int,int>>,来实现的,其中里层的map实现下标到值的映射,这样子判断一个下标是否已初始化就用map的count就可以实现,很快。之前其实使用map<string,vector<int>>来存取的,但是下标的最大值有2^31-1,判断是否初始化的时候直接TLE。。。还需要注意的是等式左右边进行判断的时候有小不同,左边外层不用判断是否初始化,右边需要,详情看代码注释。


三.程序源代码

#include <algorithm>
#include <iostream>
#include <map>
#include <stack>
#include <stdio.h>
#include <vector>
using namespace std;
map<string, int> bound;  //用来记录某个数组的size
map<string, map<int, int> > elements;  //记录某个数组已经初始化了的下标和值
string line, name, lt, rt;
int limit, index1, index2;
stack<char> equation;  //用栈来保存类似a[b[c[0]]]这样的等式并判断是否正确
//判断下标是否越界,注意<0也是越界
bool isOverflow(string n, int pos) { return (pos >= bound[n] || pos < 0); }
//判断下标是否已初始化
bool isInit(string name, int pos) { return (elements[name].count(pos) != 0); }
bool isError(string e, int flag, int &num) {
    //flag参数用来判断是等号左边的数组还是右边的
    //这个num是当前等号右边的值,如果等号右边没错,左边也没错的话,那么要更新等号左边数组的值为num
  if ((flag == 1) && (e.find('[') == e.npos)) {
      //如果右边不是个数组就是一个数字,更新num值,返回
      //atoi函数是将一个c字符串转化成数字,头文件是stdio.h
    num = atoi(e.c_str());
    return false;
  }
  while (!equation.empty())//清空栈
    equation.pop();
  for (int i = 0; i < e.length(); i++)//将当前的嵌套数组入栈
    equation.push(e[i]);
  stack<char> st_temp;  //双栈
  string s_temp = "";
  int pos;
  char temp1, temp2;
  while (!equation.empty()) {//不空就循环
    temp1 = equation.top();   //弹出栈首
    equation.pop();
    if (temp1 != '[') //如果不是[,将该元素放到临时栈
      st_temp.push(temp1); //保存数组名字
    else {  //如果是,从临时栈找到第一个]与等式栈的[匹配,两个[中间的字符就是数组名字
      while (st_temp.top() != ']') {
        temp2 = st_temp.top();
        st_temp.pop();
        s_temp += temp2;
      }
      st_temp.pop(); //记得把]弹出
      if (isalpha(s_temp[0])) {  //因为最里层是一个数字,所以第一次的s_temp不是数组名而是下标,因此这里判断一下
        if (isOverflow(s_temp, pos) || !isInit(s_temp, pos))
        //如果有错,直接返回,没错。获取外层数组的下标
          return true;
        else
          pos = elements[s_temp][pos];
      } else  //第一次s_temp是数字,保存
        pos = atoi(s_temp.c_str());
      s_temp = "";
    }
}
  while (!st_temp.empty()) {//获取最外层的数组的名字
    temp2 = st_temp.top();
    st_temp.pop();
    s_temp += temp2;
  }
  if (flag == 1) {  //如果是等号右边的等式,有错直接返回,没错就更新num值给左边
    if (isOverflow(s_temp, pos) || !isInit(s_temp, pos))
      return true;
    else
      num = elements[s_temp][pos];
  }
  if (flag == 0) {  //如果是右边,有错直接返回,没错更新数组的值
    if (isOverflow(s_temp, pos))
      return true;
    else
      elements[s_temp][pos] = num;
  }
  return false;
}
int main() {
  int n = 0, temp = 0, err_pos = 0, out = 0;//out用于判断退出程序时用的
  bool flag = false;   //是否有错
  while (getline(cin, line)) {
    n++;
    if ((line[0] != '.') && !flag) {
        //如果一组数据里之前就有错了,那么剩下的都不用判断了,因为题目只要求记录第一次错误的行数
      if (line.find("=") == line.npos) {//如果line不含等号,说明是个声明语句
        index1 = line.find("[");
        name = line.substr(0, index1);
        limit = atoi(line.substr(index1 + 1, line.length() - index1 - 2)
                         .c_str()); //要把左右两边的[]排除掉
        bound.insert(make_pair(name, limit));
        map<int, int> temp;
        elements.insert(make_pair(name, temp));
    } else {//否则,将左右两边分离分别判断
        index1 = line.find("=");
        lt = line.substr(0, index1);
        rt = line.substr(index1 + 1, line.length() - index1 - 1);
        //要注意一定要先执行判断右边的函数,获取到了右边的值,再判断左边,如果左边没错就把这个值赋给它
        flag = (isError(rt, 1, temp) || isError(lt, 0, temp));
        if (flag)//如果有错,记得行号
          err_pos = n;
      }
    }
    if (line[0] == '.') {
        //如果是.,out+1,连续两个.会让out变成2,不连续则重置为0,是2就退出程序,
      out++;
      if (out == 2)
        break;
      if (flag)
        cout << err_pos << endl;
      else
        cout << 0 << endl;
        //记得把容器清空
      n = 0;
      err_pos = 0;
      flag = false;
      temp = 0;
      bound.clear();
      elements.clear();
      while (!equation.empty())
        equation.pop();
    } else
      out = 0;
  }
  return 0;
}


船舶轨迹预测中的5个常见坑:基于LSTM单步预测的避坑实践 本文针对船舶轨迹预测中LSTM单步预测的常见问题,系统总结了五个典型陷阱及避坑实践。重点分析了如何正确处理AIS数据的非均匀采样与清洗、对航向角进行周期性编码、采用轨迹级归一化策略、缓解单步滚动预测的误差累积,并设计贴合业务的评估指标。这些实践能有效提升预测模型的准确性与实用性。 阅读详情

相关推荐

中兴FTTR光猫变简易OLT:低成本搭建全光监控与局域网实战指南

本文详细介绍了如何将中兴FTTR光猫改造为简易OLT设备,实现低成本全光监控与局域网扩展。通过LOID认证、桥接模式设置及终端数破解,用户可利用二手设备搭建高性能光纤网络,适用于远程监控和长距离组网场景,显著降低部署成本。

chair的专栏 2032

UVA-1596 找bug 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 AC代码 有个点需要注意: ASCII中,在Z和a中间还有6个字符,因此数组开大一点比较好。 getValue有多种实现方式,栈,递归,数组都可以。 下面我用的是栈,最后我也列出了递归的做法。 #include<iostream> #include<string> #include<map> #include<vector> #in

Coding home - 漂流瓶jz 616

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 527

UVa:1596 - Bug Hunt

题目描述: 输入并模拟一段程序,输出第一个bug所在的行。每行程序有两种可能: 数组定义:格式为arr[size],例如a[10]; 赋值语句:格式为arr[index]=value,例如a[0]=3或者a[a[0]]=3 赋值语句可能会出现两种bug:下标index越界,使用未初始化变量。 思路:本题有两个关键点,首先在于程序中已经出现的数组以及已经赋值过的元素的存储,可以采用

没有趟不过的河 2899

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

习题5-9 UVa1596-Bug Hunt

本题算是不难但是很绕的题了。首先要想清楚用什么来存放读入的数据,其次数组的名与值要怎么分离开来,然后如何判断有没有bug,是左值与右值分开判断?还是将判断写到一个函数里?d最后,读入的数组应该存储起来,以便应对数组嵌套。其余的代码里注释得很详细了。 这次学到了isdigit(int c)函数,它用来判断参数是否为阿拉伯数字0~9,若是返回true,否则返回false。还有使用pair类模板来创建对...

qq_21606413的博客 382

SAP中关于预测需求的重要载体:计划独立需求

预测,就是为了调节客户需求的波动、不平衡,使企业的生产计划、物料计划尽量平稳、有序的必备工具。计划独立需求,Planned Independent Requirement(PIR)是SAP系统中最常见的预测需求。

saplakes的博客 1878

UVA - 1596 Bug Hunt

/* 这题自己想的时候,想到可以用栈来匹配和拆掉括号,这个还是比较容易想到,而判断是“定义语句”,还是“赋值语句”,也可以想到用find函数,看能否找到等号。 但是,具体到怎么完整实现的时候,思路就有点懵了,可见做题量还是不够T^T 最后还是借用别人的思路,按照别人的框架,自己理解以后,再独立写了一遍 */ /* 法一: 参...

weixin_30254435的博客 237

第01章 Hermes Agent 是什么

如果读者所在的开发团队已经引入了 Cursor、Claude Code 这类 AI IDE,可能会有一个困惑:写代码已经有 AI 帮忙了,还需要 Hermes Agent 做什么?这一章将给出答案。Hermes Agent 不是另一个写代码的 AI,而是一个常驻在团队里的"AI 协作成员",专门负责写代码之外的协作环节——讨论需求、审查代码、查日志、监控告警、生成报告。学完本章,读者将清楚 Hermes 的定位以及它在团队里的角色。

亢少军的博客 75

Authentication Assertion Tickets,SAP 系统到系统单点登录里的短命凭证

SAP 系统间的身份传递机制存在 Authentication Assertion Ticket 和 SAP Logon Ticket 两种易混淆的凭证。前者用于系统间短时身份委托(有效期2分钟,通过HTTP头传输),后者用于浏览器SSO(可配置有效期,通过Cookie传输)。Assertion Ticket依赖签发系统的数字签名和严格的时间同步,适用于ABAP/Java系统间的后台作业调用。现代SAP架构已转向OAuth 2.0等标准协议,但老系统中仍需注意两种票据的关键差异:传输方式、有效期、接收方限制

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 602

UVA1596 Bug Hunt 找Bug 解题报告

因为存在嵌套,所以解析一个数组变量的值要用递归或者栈,用map维护数组名到数组信息结构体的映射,数组信息结构体应该包括数组的大小,以及该数组各个下标的值(用map< int, int >来记录)。数组定义,格式为arr[size]。例如a[10]或者b[5],可用下标分别是0~9和0~4。定义之后所有元素均为未初始化状态。赋值语句,格式为arr[index]=value。例如a[0]=3或者a[a[0]]=a[1]。程序不超过1000行,每行不超过80个字符且所有常数均为小于2^31的非负整数。

qq_45554473的博客 715

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

习题5-9 找bug(Bug Hunt, UVa1596)

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CLOSE() ios::sync_with_stdio(false) #defin

%%% 530

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

UVa 1596 Bug Hunt

这道编程题要求检测两种数组操作错误:索引越界和使用未赋值元素。算法采用惰性检查策略,使用映射结构存储数组信息,在表达式求值时递归检查错误,遇到错误立即终止处理。时间复杂度为O(L×E),空间复杂度为O(N+M),能高效处理大数组情况。关键点在于递归表达式求值和动态维护数组元素状态,既保证正确性又避免预先初始化大数组的开销。

寂静山林 415

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

UVA1596 Bug Hunt

这个题竟然卡了我一整天,最开始的思路是把每个数组元素都替换成数字并依次判断,果断写乱了,改了大半天都没改对。      今天换了个思路,把每一行代码的括号都去掉,仅保留字母和数字,这样进行判断会方便一些。同时,把每一行的字母(即数组名称提取出来),用循环过一遍,跟相应的数字对应,判断越界等的情况。     #include #include #include #include #include

wangjinhaowjh的博客 1000

UVa 1596 - Bug Hunt

这道题太欠抽了,做了N次,每次做到一半的时候就感觉思路完全不对,然后就全删了重做。 最后这次,交上一次AC了。题目本身,分为定义和赋值两部分,其中赋值又分为左右两部分,左边的内层和右边需要递归求出值来,左边外层直接赋值即可。 这道题就是考察STL的字符串。前两天学习了Python,今天用STL的string感觉特别蛋疼,int和string的相互转换还这么麻烦,还好UVa支持C++11,还有字

爆米 749

UVA 1596 Bug Hunt

题目链接:https://vjudge.net/problem/UVA-1596 题目翻译摘自《算法禁赛入门经典》 题目大意   输入并模拟执行一段程序,输出第一个bug所在的行。每行程序有两种可能: 数组定义,格式为 arr[size]。例如 a[10] 或者 b[5],可用下标分别是 0~9 和 0~4。定义之后所有元素均为未初始化状态。 赋值语句,格式为 arr[in...

weixin_30600197的博客 265

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

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

weixin_30846599的博客 188

Bug Hunt UVA - 1596

  In this problem, we consider a simple programming language that has only declarations of onedimensional integer arrays and assignment statements. The problem is to find a bug in the given program. The syntax of this language is given in BNF as follows:  

就很好(*^_^*)的博客 302

UVA1596 - Bug Hunt

In this problem, we consider a simple programming language that has only declarations of onedimensional integer arrays and assignment statements. The problem is to find a bug in the given program. The...

hanker99的博客 348

UVA - 1596 Bug Hunt

传送门:UVA-1596 细节题,还是挺磨人的,思路都注释在代码里了 AC代码:   #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;map&gt; #include&lt;sstream&gt; using namespace std; int main() { string pq[1009],tmp;//pq存储...

weixin_42547447的博客 191

UVa1596 - Bug Hunt

#include #include #include #include using namespace std; string s0, s, s1, s2, left_value,right_value; int bug; map a; map value; string get_value(string x, string arr){ unsigned int t = 0; st

Dosth_Magic 1358

UVa 1596 Bug Hunt易错的地方

解决这个题我的方法有点麻烦,我用了两个映射表,一个是用来保存数组名,以及其长度。另一个是用来保存已经初始化的元素,及其值。但是这里我两个映射表中的元素都设置为string类型,为了好处理。//d保存定义的数组和其长度,f表示赋值的元素和其值 map<string, string> d, f;现在我们来看看主函数:int main() { string buf; cin >> buf;

super_son的博客 365
上一篇: C++ string find方法与substr
下一篇: 华三PAP、CHAP验证
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值