题解 P1322 【logo语言】

2018-05-16 19:04:15


模拟是个好东西。

根本用不着什么算术栈啊这些乱七八糟的(我对此有心理阴影),只要弄一个link数组来从‘[’的位置连接到到‘]’的位置(有点像哈希表)

上代码

#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;
}