洛谷P1322题解

时间:2021-07-27
本文章向大家介绍洛谷P1322题解,主要包括洛谷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很简单,分别处理BKFD别问我为什么先处理BK再处理FD),最后,我们判断x是否为‘]’,若为‘]’,表示REPEAT结束,break掉,最后的最后,return好不容易算出来的rt;

主函数很好理解,别忘记有abs就行;
(the end).

原文地址:https://www.cnblogs.com/Wildcxj/p/15067777.html