1. 程式人生 > >洛谷 P2628 冒險島

洛谷 P2628 冒險島

數據 span algorithm 遊戲 length badge amp blank content

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 冒險島