洛谷 P2628 冒險島
P2628 冒險島
題目背景
冒險島是費老師新開發的一種情景模擬電腦的遊戲,通過擲骰子(1~6個數字之間),讓一種人物(棋子)在棋紙上從左至右的行走,從而模擬冒險的故事……
題目描述
棋紙上有一條從左至右的很長的路,整條路是一連串符號組成,表明路的狀況,棋子必須在符號組成的路上行走。每擲一下骰子得到的數字,棋子就可以走擲得的數字所對應的步數,比如擲3,就可以走3步。
路上有兩種特殊符號可以改變棋子的行走。
一種是“>”符號,一旦棋子走完了擲骰子的步數,最終停留在這個符號上,後面有緊跟著2個以上“>”
還有一種是“*”符號,一旦棋子走完了擲骰子的步數,最終停留在這個符號上,後面又緊跟著兩個以上“*”,就要受到後退懲罰,需要退後k步,這個k步就是從當前“*”開始的連續的“*”的數量。
每次擲數後,獎勵或懲罰至多一次,如果獎勵或懲罰後棋子又落在第二種特殊符號上,則不能再受到獎勵或懲罰。
如果走的棋子超出棋紙右邊界最後一個符號,則停在最後一個符號上;如果超出左邊界,則停在第一個符號上。
若幹次擲骰子後,請問遊戲中的人物(棋子)走到了哪步?離終點還差幾步?
輸入輸出格式
輸入格式:
第一行為一個字符串s,字符串中的每個字符表示棋紙的路的狀況。
第二行是一個n,表示擲了n次骰子。
第三行是n個整數(1~6的範圍),表明擲了n次骰子得到的數字,數字之間有一個空格。
輸出格式:
只有兩個數字,表明目前所在符號的序號和離終點符號的步數,數子中間有一個空格。註意輸出末尾有換行。
輸入輸出樣例
輸入樣例#1: 復制yhfA>>>fhsdfa***>>>foaoad
3
5 6 6
輸出樣例#1: 復制20 5
說明
【樣例說明】
在遊戲中,第一次擲的是5,則走到第一個>的位置,獲得獎勵前進至左起第二個f處。第二次擲的是6,則走到*的位置,受懲罰退3步,至d處。第三次擲的是6,則走至左起第四個>號處,獲獎勵前進至f。最終棋子停留的符號是第20個(從左至右的數),離終點符號d(含)相差5步數。
【數據範圍】
對於50%的數據,1<=s的長度<=255,0<=n<=1000。
對於100%的數據,256<=s的長度<=1000000,0<=n<=100000。
思路:模擬。
註意:讀入字符串可能有空格。這個題目太坑了。。。(╯‵□′)╯︵┻━┻
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; string s; int n,num,len,pos=-1; int main(){ getline(cin,s); scanf("%d",&n); len=s.length()-1; for(int i=1;i<=n;i++){ scanf("%d",&num); pos+=num;int tot=0; if(pos>=len) pos=len-1; if(s[pos]==‘>‘&&s[pos+1]==‘>‘&&s[pos+2]==‘>‘) while(s[pos]==‘>‘) pos++; else if(s[pos]==‘*‘&&s[pos+1]==‘*‘&&s[pos+2]==‘*‘){ while(s[pos+tot]==‘*‘) tot++; pos-=tot; } if(pos<0) pos=0; if(pos>=len) pos=len-1; } cout<<pos+1<<" "<<len-1-pos; }
洛谷 P2628 冒險島