1. 程式人生 > 其它 >洛谷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).