自己对于这道题目的理解
主要参考的代码链接 传送门
BEGIN
LOOP n
OP 4
LOOP 3
LOOP n
OP 1
END
OP 2
END
OP 1
END
OP 17
OP 17
LOOP n
OP 4
LOOP 3
LOOP n
OP 1
END
OP 2
END
OP 1
END
OP 17
END
怎样确定层次关系
我们可以看到在begin->end的下一层有两个Loop和三个Op,一个难点在于我们怎样确定同一层次有几个块状结构。
- 采用while循环,当返回false的时候,代表本个Loop-End结束,但是函数的返回值是true.
- 当碰到一个块状结构开始的时候,用while循环,在OP的时候,用来返回函数值
#include<iostream>
#include<stdio.h>
#include<assert.h>
#include<string>
using namespace std;
double string_to_double(string s) {
return atof(s.c_str());
}
bool getans(int a[]) {
string s;
cin>>s;
if (s[0] == 'B')
while(getans(a));
if (s[0] == 'L') {
cin>>s; // s为n 或者为数字
int p[11] = {0};
while(getans(p));
if (isdigit(s[0])) {
double temp = string_to_double(s);
for (int i = 0; i<11; i++)
p[i] *= temp;
} else {
for (int i = 10; i>=1; i--)
p[i] = p[i-1];
p[0] = 0;
}
for (int i = 0; i<11; i++) {
a[i] += p[i];
}
}
if (s[0] == 'O') {
cin>>s; // s为n 或者为数字
a[0] += string_to_double(s);
return getans(a);
}
if (s[0] == 'E')
return false;
return true;
}
int main() {
// freopen("in.txt", "r", stdin);
int testcase;
cin>>testcase;
int t = 1;
while(testcase--) {
int exp[11] = {0};
getans(exp);
for (int i = 0; i<11; i++){
cout<<exp[i]<<" ";
}
cout<<endl;
}
return 0;
}