[刷题]算法竞赛入门经典(第2版) 5-9/UVa1596 - Bug Hunt
//开学了,好烦啊啊啊啊啊!怎么开个学那么多破事情!!都俩星期了,终于有时间写出来一道题
题意:不难理解,不写了。这几天忙的心累。
代码:(Accepted, 0.010s)
//UVa1596 - Bug Hunt
#include<iostream>
#include<sstream>
#include<string>
#include<stack>
#include<map>
using namespace std;
struct o_O {
int size;
map<int, int> dim;
};
map<string, o_O> dat;
string line;
bool get(stack<string>& st,int& num) {
while (!st.empty()) {
if (num >= dat[st.top()].size) return false;
if (!dat[st.top()].dim.count(num)) return false;
num = dat[st.top()].dim[num];
st.pop();
}
return true;
}
bool declare() {//定义数组
for (auto& r : line)
if (r == '[' || r == ']') r = ' ';
istringstream in(line);
string na;
int nu;
in >> na >> nu;
dat[na].size = nu;
return nu >= 0;
}
bool solve(){//处理赋值
for (auto& r : line)
if (r == '[' || r == ']' || r == '=') r = ' ';
stack<string> stl, str;
int numl, numr;
istringstream in(line);
string now,sl;
in >> sl;
while (in >> now && now[0] > '9') stl.push(now);
istringstream inl(now);inl >> numl;
while (in >> now && now[0] > '9') str.push(now);
istringstream inr(now);inr >> numr;
if (!get(stl, numl) || !get(str, numr)) return false;
if (numl >= dat[sl].size) return false;
dat[sl].dim[numl] = numr;
return true;
}
int main()
{
//freopen("in.txt", "r", stdin);//
while (cin>>line && line[0] != '.') {
unsigned flag = 0, linenum = 0;
dat.clear();
do {
++linenum;
if (flag) continue;
if (!(line.find('=') == string::npos ? declare() : solve()))
flag = linenum;
} while (cin>>line && line[0] != '.');
cout << flag << '\n';
}
return 0;
}
分析:给数组找bug,只有赋值和定义两种语句。一开始我想复杂了,以为会有诸如
a[b[c[0]=1]=d[2]]=e[e[e[e[e[e[3]]]=e[1]=e[2]=e[3]=233]]]=1
这种情况发生,于是就用递归做,做了好久,还老是WA(/* 实在难抽出一块一块的时间来学习,断断续续写了一星期,思路老是想到一半就断了。而且事情多烦的脑子疼,想不出东西。妈蛋还不如放假。*/)
结果昨天晚上一个老司机跟我说,干嘛那么烦,一行只有一个赋值。。。。。
好的,瞬间简单了。。今天花了一个小时不知道到不到就做出来了。可能是用了sstream,再转存到stack的原因,比较慢,用时10ms。
附:之前以为一行可以多个赋值的时候写的代码(更新:终于调试的AC了):
代码:(Accepted, 0.010s)
//UVa1596 - Bug Hunt
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<queue>
#include<map>
using namespace std;
string line;
queue<string> qu;
struct o_O {
int len;
map<int, int> def;
};
map<string, o_O> dat;
int get() {//从qu中get当前index的值,通过递归实现
string now = qu.front();
qu.pop();
if (now[0] > '9') {//若为变量名,说明有嵌套
int n = get();//得到当前变量的index
qu.pop();
if (n >= dat[now].len || n < 0) return -1;//数组越界
if (qu.empty() || qu.front()[0] == '}') {//不是赋值,直接返回
if (!dat[now].def.count(n)) return -1;//没初始化
return dat[now].def[n];
}
return dat[now].def[n] = get();//赋值
}
int num;//若为数字
istringstream iin(now);
iin >> num;
return num;
}
bool declare() {//定义数组
for (auto& r : line)
if (r == '[' || r == ']') r = ' ';
istringstream in(line);
string na;
int nu;
in >> na >> nu;
dat[na].len = nu;
return nu >= 0;
}
bool solve() {//预处理当前行
for (auto& r : line)
if (r == '[' || r == '=') r = ' ';
istringstream in(line);
string now;
int num;
while (in >> now) {
if (now[0] > '9') qu.push(now);
else {
int i = 0;
for (auto& r : now)
if (r == ']') r = ' ', ++i;
qu.push(now);
while (i--) qu.push("}");//为什么要用}不用],一开始想的是}的ASCII是125,而]夹在大小写字母之间。然而后来发现并没有什么卵用
}
}
return get() >=0;
}
int main()
{
//freopen("in.txt", "r", stdin);//
while (getline(cin, line) && line[0] != '.') {
unsigned flag = 0, linenum = 0;
dat.clear();
while (!qu.empty()) qu.pop();//queue不自带clear()的?!
do {
++linenum;
if (flag) continue;
if (!(line.find('=') == string::npos ? declare() : solve()))
flag = linenum;
} while (getline(cin, line) && line[0] != '.');
cout << flag << '\n';
}
return 0;
}
虽然是我想多了,但是应用到单个赋值也是没问题的呀。但是还是想不通哪里就WA了。。。应该是哪个特殊的格式没考虑到。以后有心情再调试。(更新:终于调试得AC啦,代码已经覆盖更新。竟然也是0.010s。)
[刷题]算法竞赛入门经典(第2版) 5-9/UVa1596 - Bug Hunt的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...
- [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
- [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...
- [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile
题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...
- [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536
这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...
- [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities
题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...
- [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary
题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...
- [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...
随机推荐
- MVC学习笔记2 - Razor语法
Razor 同时支持 C# (C sharp) 和 VB (Visual Basic). C# 的主要 Razor 语法规则 Razor 代码封装于 @{ ... } 中 行内表达式(变量和函数)以 ...
- Modbus通信协议的压力测试
最近物联网都比较的火,因此,特别为各位兄弟姐妹们,奉上一款Mobus协议的测试软件,可以用来做设备的压力测试,和通信测试. 起初软件开发缘由是我们最近在开发一款设备,需要将多个DS18B20并联起来, ...
- nvm安装和配置详细教程
nvm是nodejs的版本管理工具,为什么要用nvm,你能百度到这篇文章相比是遇到不得不用的原因了,我们知道nodejs官方更新的速度非常快,有时候业务需要需要用某某版本,如果用的是msi安装,虽然安 ...
- PMP和PRINCE2的价值各是什么?PRINCE2的含金量如何?PMP和prince2有什么区别?
很多学员朋友会问我同样的问题:"PMP和PRINCE2到底有什么区别?哪个含金量更高?"看来,这是所有要参加认证的朋友普遍关心的问题,我将根据自己的切身体会,从三个方面回答这个问题 ...
- 参加光环国际PRINCE2培训
挑战埃及是全球首套能够同时适配PRINCE2认证人群,PMP认证人群的项目管理沙盘演练游戏.沙盘通过使用乐高积木作为道具,通过一场互动性极强的情景模拟为全球项目经理还原了四千年前古埃及金字塔建造的情景 ...
- Java--JDBC连接数据库
我们知道Java中的jdbc是用来连接应用程序和数据系统的,本篇文章主要就来看看关于JDBC的实现和使用细节.主要包含以下几点内容: JDBC的基本知识(数据驱动程序) JDBC的连接配置 ...
- Uva 11609 Teams (组合数学)
题意:有n个人,选不少于一个人参加比赛,其中一人当队长,有多少种选择方案. 思路:我们首先C(n,1)选出一人当队长,然后剩下的 n-1 人组合的总数为2^(n-1),这里用快速幂解决 代码: #in ...
- 天气渐热,来片雪花降降温——Android自定义SurfaceView实现雪花效果
实现雪花的效果其实也可以通过自定义View的方式来实现的(SurfaceView也是继承自View的),而且操作上也相对简单一些,当然也有一些不足啦... 相对于View,SurfaceView有如下 ...
- This Handler class should be static or leaks might occur Android
首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露 ...
- MySQL中文全文搜索
我们在mysql数据中可以使用match against语句解决中文全文搜索的问题 先看一个例句: SELECT * FROM v9_search WHERE `siteid`= '1' AND `t ...