题目背景
zrz在写程序,他叫你帮他看看他的程序有没有问题。
题目描述
有一个若干行的程序,每一行只有一个命令,可能出现的命令有一下几种
int a[maxn] 声明一个数组,开头一定是int,不会是别的什么longlong之类的,a是指一个数组的名称(不一定是a,也有可能是别的字母或者多个字母,总之长度不超过10),后面是一个中括号和一个数字或一个变量,表示数组大小(从0到maxn-1,maxn<=100),数组声明之后里面的数均为0。
a[i] h 把h赋给a[i](也就是a[i]=h),同样h可能是一个数字或者是一个变量,i代表一个数字或者是一个变量。
cout h 输出h,h一定是个变量。
输入格式
若干行:每行一个命令
输出格式
对于每一个输出的命令(即cout),输出一行。如果在某一行发现有数组下标越界(切记,只可能出现这种错误,不会出现别的比如重定义之类的问题),不管是哪个命令,都要立即停止,无论下面有多少行命令都忽略,并输出-1。
输入输出样例
输入 #1
int a[10]
a[a[0]] 2
cout a[0]
输出 #1
2
输入#1
int a[10]
a[0] 10
cout a[0]
a[a[0]] 1
cout a[0]
输出 #2
10
-1
AC代码展示
如果觉得有用 就点赞+收藏 鼓励一下吧
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
string s1,s2; //一行中两部分字符串读取 用于后续解析
int num,pos1,pos2; //记录[]中解析式代表的真正的数字意义
//pos则分别表示 跟踪s1 s2字符产的解析位置
unordered_map<string,unordered_map<int,int> > mp;
//每个数组的各个下标 -1下标代表数组的长度
string GetArrName(string &str,int &pos){ //取出数组的名字
string s="";
while(str[pos]!='[') s+=str[pos++];
return s;
}
int GetArrNum(string &str,int &pos){ //得到数组中表达式或数字中代表的具体值
if(isdigit(str[pos])){ //直接为数字
int res=0;
while(isdigit(str[pos])) res=res*10+str[pos]-'0';
pos++;
return res;
}
string arr=GetArrName(str,pos); //若为数组嵌套 则递归取其中数字
pos++;
int res=GetArrNum(str,pos);
pos++;
if(res<0||res>mp[arr][-1]) return -1; //检查越界
return mp[arr][res];
}
int main(){
int flag=0;
string arr;
while(cin>>s1>>s2){
if(flag) continue;
num=pos1=pos2=0;
if(s1=="int"){
arr=GetArrName(s2,pos2);
pos2++;
num=GetArrNum(s2,pos2);
//检查下标越界
if(num<0){
flag=1;
cout<<"-1"<<endl;
continue;
}
mp[arr][-1]=num;
}
else if(s1=="cout"){
num=GetArrNum(s2,pos2);
if(num==-1){
flag=1;
cout<<"-1"<<endl;
return 0;
}
cout<<num<<endl;
}
else{
arr=GetArrName(s1,pos1);
pos1++;
num=GetArrNum(s1,pos1);
int temp=GetArrNum(s2,pos2);
if(num<0||num>=mp[arr][-1]){
flag=1;
cout<<"-1"<<endl;
return 0;
}
mp[arr][num]=temp;
}
}
return 0;
}