洛谷P1322题解
这道题是一道很好的递归题。(当然模拟也可以做)
首先我们看题:在次题中,logo有3个关键词:
1.FD(向前);
2.BK(向后);
3.REPEAT(重复)。
这些关键词语法分别为:
1.FD n 表示向前移动n步;
2.BK n 表示向后移动n步;
3.REPEAT n[......(代码)]表示重复执行中括号里面的代码n次。
好,我们的题意讲完了。(终于讲完了)
现在,我们正式开始讲解题目:
首先的首先,再声明一下,我用的是递归做法。(别告诉我您不会递归)
首先来看你们最爱的coding:
重要提醒:勿抄代码,否则将会有棕名危险
#include<bits/stdc++.h>
using namespace std;
int func()
{
char ch,x;
string wz;//尾缀(K,D,EPEAT)
int k,rt=0/*return*/;
while(cin>>ch)
{
if(ch==']')break;
cin>>wz>>k;
if(ch=='R')//REPEAT
{
x=getchar();//[
rt+=k*func();
x=getchar();//]
}
if(ch=='B')//BK
{
x=getchar();
rt-=k;
}
if(ch=='F')//FD
{
x=getchar();
rt+=k;
}
if(x==']') break;
}
return rt;
}
int main()
{
cout<<abs(func());//别忘记有abs(绝对值)
return 0;
}
看了代码,心情好了很多吧,现在进入重点,讲解部分:
我们来分析一波代码:
前两行很好理解,是头文件和命名空间,我们把精力放在func函数上;
func里首先是定义变量,ch表示输入的当前字符,k表示前面的n,wz是尾缀,x是一个无用的变量,rt是返回值;
接着是一个巨大的while,括号里面用来输入,如果ch是']',直接break,接着输入尾缀和k,很好理解;
终于来到了主体,这边,如果ch为R,则代表wz="EPEAT",先将‘[’输入了,在进行递归,让他把REPEAT过后的值算出来,最后输入‘]’,easy,下面两个if很简单,分别处理BK和FD(别问我为什么先处理BK再处理FD),最后,我们判断x是否为‘]’,若为‘]’,表示REPEAT结束,break掉,最后的最后,return好不容易算出来的rt;
主函数很好理解,别忘记有abs就行;
(the end).

浙公网安备 33010602011771号