P2628 冒险岛 AC于2018.10.31

87 篇文章 0 订阅
54 篇文章 0 订阅

原题

题目背景

冒险岛是费老师新开发的一种情景模拟电脑的游戏,通过掷骰子(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<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1000010];
int add[1000010],a[1000010];
int main()
{
    int len,i,k,n;
    gets(s);
    len=strlen(s)-1;            //要减去换行符所占的长度 
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(i=len-1;i>=0;i--)
    {      //从后往前预处理奖励或惩罚的点 
        if(s[i]=='>')
        {
        	if(s[i+1]!='>')
        	add[i]=1;
            else
            add[i]=add[i+1]+1;
        }
        if(s[i]=='*')
        {
            if(s[i+1]!='*')
            add[i]=1;
            else
            add[i]=add[i+1]+1;
        }
    }
    a[1]--;         //由于所有测试数据的起点都为-1,所以第一步只能走啊a[1]-1步 
    k=0;
    for(i=1;i<=n;i++)
    {
        k+=a[i];
        if(add[k]>=3)
        {
            if(s[k]=='>')
            k+=add[k];
            else
            if(s[k]=='*')
            k-=add[k];
        }
        if(k<0)                 //如果当前位置越出边界,则让它回到边界 
        k=0;
        if(k>len-1)
        k=len-1;
    }
    k++;//题目中的第一个字符的位置是一,输入的字符串的第一个字符的位置是零,故需再次加上一 
    printf("%d %d\n",k,len-k);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值