洛谷P1322題解
阿新 • • 發佈:2021-07-28
這道題是一道很好的遞迴題。(當然模擬也可以做)
首先我們看題:在次題中,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
主函式很好理解,別忘記有abs就行;
(the end).