习题5-9 找bug (Bug Hunt,ACM/ICPC Tokyo 2007,UVa1596)

2024-04-13 03:32

本文主要是介绍习题5-9 找bug (Bug Hunt,ACM/ICPC Tokyo 2007,UVa1596),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接:https://vjudge.net/problem/UVA-1596
分类:STL综合
备注:中级模拟
前言:说是题目要我找输入的bug,实际找的却是我自己的bug…细数一下我犯过的错误:①一开始没想好怎么写函数,传入参数调来调去乱套了,最后还是删了重来终于让思路更清晰了;②遗漏条件,某个部分忽略了题目条件;③自己犯蠢,我居然在算下标的时候从低位到高位遍历,但是用的方法却是高位加到低位,因为这个憨批操作debug了好久!

思路

  • 用了两个map,一个map<数组名,范围>记录出现过的数组和其下标范围,还有一个map<pair<数组名,下标>,值>记录某个数组在某个下标所有的值。
  • 最关键的还是求数组元素的嵌套,主要是以每个最左边的’[‘和最右边的’]'作为头和尾,st和tail,用递归函数求括号中的值,进入函数后遍历st+1到tail-1,一旦发现其中有中括号则递归进入更深一层函数,直到没有括号出现直接得到下标的数值然后返回。具体看下面代码实现。
  • 在找值的过程中判断了题目条件,但是外面的一些操作也得记得判断。

代码如下:

#include<cstdio>
#include<string>
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<string, ll>PII;
string line;
int ans;
map <string, ll> var;
map<PII, ll>value;
ll V(string line, int st, int tail)//st为最左边的'['的下标,tail为最右边的']'的下标
{ll xb = 0;for (int i = st + 1; i < tail; i++)//在st和tail之间还有中括号if (line[i] == '['){string variable = line.substr(st + 1, i - st - 1);for (int j = tail - 1;; j--)if (line[j] == ']'){xb = V(line, i, j);break;}if (!var.count(variable) || var[variable] <= xb)return -1;//未初始化或者数组下标越界if (!value.count(PII(variable, xb)))return -1;//未赋值却要用值return value[PII(variable, xb)];}for (int i = st + 1; i < tail; i++)//在这里我傻逼了xb = 10 * xb + line[i] - '0';return xb;//中间无中括号直接返回值
}
void find_bug(string line, int row)
{int pst = 0;while (line[pst] != '[')pst++;string variable = line.substr(0, pst);ll xb = 0;int pos = line.find('=', 0);if (pos == string::npos){xb = V(line, pst, line.length() - 1);if (xb == -1) { ans = row; return; }var[variable] = xb;//初始化数组(不赋值)}else//赋值操作{xb = V(line, pst, pos - 1);//找到左值下标if (xb == -1 || !var.count(variable) || xb >= var[variable]) { ans = row; return; }ll price = V(line, pos, line.length());//'='和末尾元素右边一个位置也可以看作一组'[',']'if (price == -1) { ans = row; return; }value[PII(variable, xb)] = price;}
}
int main(void)
{int row = 0, cnt = 0;while (getline(cin, line)){++row;if (line[0] == '.'){cnt++;if (cnt == 2)return 0;printf("%d\n", ans);row = ans = 0;var.clear();value.clear();continue;}cnt = 0;if (!ans)find_bug(line, row);}return 0;
}

这篇关于习题5-9 找bug (Bug Hunt,ACM/ICPC Tokyo 2007,UVa1596)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899027

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

【C++ Primer Plus习题】12.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "String.h"using namespace std;int main(){String s1(" and I am a

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4

获取Excel文档的版本(2003或者2007)

因工作需要解析excel文档,用poi插件来进行处理,但是2003版本之前的和2007版本之后的解析方式不一样,开始,我们是以后缀名来区分的(2003之前是xls,2007之后是xlsx),后来发现,如果一个2003文档的后缀名被改成xlsx或反之,解析都会出现一些莫名其妙的问题,所以根据文档内容来判断版本是非常必要的。于是在网上找了很久终于找到一个切实可行的方法,代码如下 public s

C语言程序与设计第四版课后习题 - 1~8章大合集

前言 本文章是一个大合集,按照课后习题的命名方式命名,方便寻找,只需要在目录上点相对应的题号即可在这里插入图片描述 第一章课后习题 1.1 编写一个C程序 题目概述: 请参照本章例题,编写一个C程序,输出一下信息: *****************************Very good!***************************** 代码实现: #define

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追

【C++ Primer Plus习题】12.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "Cow.h"using namespace std;int main(){Cow c1;Cow c2("老母牛", "喝奶"