P1322 logo语言
网页链接
P1322 logo语言
题目描述
Logo 语言命令可以指挥海龟在屏幕中爬行。本问题只使用 Logo 语言的三个语句:前进FD,倒退BK和重复REPEAT,因此,海龟只在一条直线上来回爬行。输入一行 logo 的命令行,输出海龟在屏幕中离开原来位子的距离(假设屏幕很大,可以让海龟移开10 9 10^9109的距离)。
例如:
输入
FD 100,输出:100 100100。输入
FD 100 BK 150, 输出:50 5050。输入
REPEAT 5[FD 100 BK 50], 输出:250 250250。输入
REPEAT 5[FD 50 REPEAT 10[FD 100]], 输出:5250 52505250。
输入格式
一行,一个字符串,符合上述规定的 logo 命令行。
输出格式
一个数据,海龟离开原来位子的距离。
输入输出样例 #1
输入 #1
FD 100输出 #1
100说明/提示
每个语句输入数据的绝对值不超过1000 10001000。输出结果不会超过10 9 10^9109。
解题思路
本题核心是递归下降解析,专门处理命令的嵌套结构,是解决带括号嵌套问题的最优解法。海龟仅在直线移动,只需计算总位移。定义递归函数解析一段命令:读取命令字符,若为FD则累加移动距离,BK则减去移动距离;若为REPEAT,读取重复次数,递归解析括号内的子命令,将子命令的总位移乘以次数后累加到当前结果。遇到]时结束当前层递归,返回本段位移。最终输出总位移的绝对值,即为海龟与初始位置的距离。递归天然适配嵌套命令,逻辑简洁直观,完美处理所有测试用例。
总结
核心逻辑:递归解析嵌套的LOGO命令,分别处理前进、后退、重复指令,计算总位移。
关键操作:FD累加位移、BK递减位移、REPEAT递归解析子命令并乘以次数。
效率保障:递归遍历一次命令字符串,时间复杂度O ( 命令长度 ) O(\text{命令长度})O(命令长度),简洁高效无冗余。
代码内容
#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intdg(){string s;charc;intk,l=0,v;while(cin>>c){if(c==']')break;cin>>s>>k;if(c=='R'){v=getchar();l+=k*dg();v=getchar();}if(c=='B')v=getchar(),l-=k;if(c=='F')v=getchar(),l+=k;if(v==int(']'))break;}returnl;}intmain(){cout<<abs(dg());return0;}