题解 P1322 【logo语言】
SIGSEGV
2018-05-16 19:04:15
模拟是个好东西。
根本用不着什么算术栈啊这些乱七八糟的(我对此有心理阴影),只要弄一个link数组来从‘[’的位置连接到到‘]’的位置(有点像哈希表)
上代码
```cpp
#include <bits/stdc++.h>
using namespace std;
int n,l,ans,link[300];
char s[300];
int expr(int start,int end) //前闭后开[start,end)区间
{
int ans = 0;
for (int i = start;i < end;i++)
{
if (!isalpha(s[i])) continue;//数字空格这些统统去掉
bool fr = 0;bool rp = 0;int num = 0;
if (s[i] == 'F') sscanf(&s[i + 3],"%d",&num),fr = 1;//前进
else if (s[i] == 'B') sscanf(&s[i + 3],"%d",&num);
else if (s[i] == 'R') sscanf(&s[i + 7],"%d",&num),rp = 1;//循环
else continue;//一边去
if (!rp)
{
if (fr) ans += num;else ans -= num;
continue;
}
while (s[i] != '[') i++;//挪到左括号位置
int ed = link[i];
ans += num * expr(i + 1,ed);
i = ed;
}
return ans;
}
int main ()
{
gets(s);l = strlen(s);
stack<int> stk;
for (int i = 0;i < l;i++) //匹配计算
{
if (s[i] == '[') stk.push(i);
if (s[i] == ']') link[stk.top()] = i,stk.pop();
}
;
printf("%d",abs(expr(0,l)));//打印结果,注意abs
return 0;
}
```