题解 P1322 【logo语言】

SIGSEGV

2018-05-16 19:04:15

Solution

模拟是个好东西。 根本用不着什么算术栈啊这些乱七八糟的(我对此有心理阴影),只要弄一个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; } ```