logo语言(在线处理/离线处理+字符串+递归)

logo语言

题目描述

Logo 语言命令可以指挥海龟在屏幕中爬行。本问题只使用 Logo 语言的三个语句:前进 FD,倒退 BK 和重复 REPEAT,因此,海龟只在一条直线上来回爬行。输入一行 logo 的命令行,输出海龟在屏幕中离开原来位子的距离(假设屏幕很大,可以让海龟移开 1 0 9 10^9 109 的距离)。

例如:

  • 输入 FD 100 ,输出: 100 100 100

  • 输入 FD 100 BK 150, 输出: 50 50 50

  • 输入 REPEAT 5[FD 100 BK 50], 输出: 250 250 250

  • 输入 REPEAT 5[FD 50 REPEAT 10[FD 100]], 输出: 5250 5250 5250

输入格式

一行,一个字符串,符合上述规定的 logo 命令行。

输出格式

一个数据,海龟离开原来位子的距离。

样例 #1

样例输入 #1

FD 100

样例输出 #1

100

提示

每个语句输入数据的绝对值不超过 1000 1000 1000。输出结果不会超过 1 0 9 10^9 109

思路

本道题就是单纯模拟这个思路。

拓展:对于这个字符串的,然后要一层一层深入进去的,我们就得用递归的方式,之前的 正则表达式 的那道题采用的也是这种思路。

代码(离线版)

#include<iostream>

using namespace std;

string a;
int n,x;

int f(){
    
    int l=0;
    while(x<n){
        if(a[x]==']')break;
        
        if(a[x]=='R'){
            x+=7;
            int sum=0;
            while(a[x]>='0'&&a[x]<='9'){
                sum=sum*10+a[x++]-'0';
            }
            l+=f()*sum;
            x++;
        }
        if(a[x]=='B'){
            x+=3;
            int sum=0;
            while(a[x]>='0'&&a[x]<='9'){
                sum=sum*10+a[x++]-'0';
            }
            l-=sum;
        }
        
        if(a[x]=='F'){
            x+=3;
            int sum=0;
            while(a[x]>='0'&&a[x]<='9'){
                sum=sum*10+a[x++]-'0';
            }
            l+=sum;
        }
        if(a[x]==' '||a[x]=='[')x++;
    }
    
    return l;
}

int main(){
    getline(cin,a);
    
    n=a.size();
    
    cout<<abs(f());
    
    return 0;
}

代码(在线版)

//对于有多个括号的,我们要用递归

#include<iostream>
#include<algorithm>

using namespace std;

int f(){
    string b;
    int n;
    char t,c;
    int l=0;
    while(cin>>c){
        if(c==']')break;
        cin>>b>>n;
        // cout<<n<<" "<<l<<endl;
        if(c=='R'){
           t=getchar();
           l+=n*f();
           t=getchar();
        }
        
        if(c=='B'){
            t=getchar();
            l-=n;
        }
        if(c=='F'){
            t=getchar();
            l+=n;
        }
        if(t==']'){
            break;
        }
        // cout<<l<<" "<<n<<endl;
    }
    return l;
}

int main(){
    
    cout<<abs(f());
    
    return 0;
}
  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

green qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值