代码
#include<bits/stdc++.h>
using namespace std;
char logo[300];
int len=0;
int s=0;
void read(){//注1
int c=getchar();
while((c>='A'&&c<='Z')||c==' '||(c>='0'&&c<='9')||c=='['||c==']'){
logo[len]=c;
len++;
c=getchar();
}
}
int number(int x,int y){//注2
int t=0;
while(x<=y){
t=(t<<3)+(t<<1)+logo[x]-'0';
x++;
}
return t;
}
void FD(int x,int y){
int t=number(x,y);
s=s+t;
}
void BK(int x,int y){
int t=number(x,y);
s=s-t;
}
void find(int x,int y){
for(int i=x;i<y;){//注3(1)
if(logo[i]=='F'){
int u=-1;
for(int j=i+3;j<y;j++){
if(logo[j]==' '){
u=j;
break;
}
}
if(u==-1){
FD(i+3,y-1);
i=len;
}
else{
FD(i+3,u-1);
i=u+1;
}
}
else if(logo[i]=='B'){
int u=-1;
for(int j=i+3;j<y;j++){
if(logo[j]==' '){
u=j;
break;
}
}
if(u==-1){
BK(i+3,y-1);
i=len;
}
else{
BK(i+3,u-1);
i=u+1;
}
}
else if(logo[i]=='R'){
int u;
for(int j=i+7;j<len;j++){
if(logo[j]=='['){
u=j;
break;
}
}
int _x=i+7;
int _y=u-1;
int q=1;
i=u;
while(q!=0){
i++;
if(logo[i]=='[') q++;
else if(logo[i]==']') q--;
}
int _l=u+1;
int _r=i;//注3(2)
int ti=number(_x,_y);
for(int k=1;k<=ti;k++){
find(_l,_r);//注3(3)
}
i++;
}
else{//注4
i++;
}
}
}
int main(){
read();
find(0,len);
cout<<abs(s);
}
思路
思路并不是很难,即读入字符串,遍历,找到关键字(FD,BK,REPEAT),再把中间一段代码扔到递归里去,难点在于需要不断地调试和亿点点一点点细节的处理。
一些注意点
注1
因为scanf和string+cin读不了空格,所以用的是getchar(又快,len还能表示长度,nice)
注2
简单的数字转换对吧。
注3
注意这里是左闭右开
注4
一定要加!!!
不然过不了某些不太正常的数据(有时候有空格,有时候没有(鬼知道什么玩意儿))