UESTC 758 P酱的冒险旅途

117 篇文章 2 订阅
53 篇文章 0 订阅

P酱的冒险旅途

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

P酱是个可爱的男孩子,有一天他在野外冒险,不知不觉中走入了一块神奇的地方。他在 0 时刻进入这个地方,每一时刻他都只能向某一特定的方

向移动长度为1的距离,当然他也可以选择不移动。移动需要花费 1 的时间。

各个时刻他允许移动的方向由一个字符串给出,字符串只包含UDLR四种字符,其中U表示向上( y 轴正方向)移动,D表示向下( y

负方向)移动,L表示向左( x 轴负方向)移动,R表示向右( x 轴正方向)移动。

字符串的第 x 个字符代表了第 x 时刻P酱可以移动的方向,字符串的长度只有 t ,也就是说,超过 t 时刻,P酱就要被邪恶的魔王大爷抓走了~

现在P酱在坐标原点,即 (0,0) 点,而出口在 (x,y)   点,P酱希望在规定的时间 t 内尽快走到出口。帮助P酱在最短的时间内离开这里吧~

Input

第一行包含一个正数  T  ( T100 ),表示数据组数。

接下来每组数据包含两行,第一行包含三个整数  x,y,t     ( 105x,y105,0<t105       );第二行包含一个长度为 t 的字符串,第 i 个字符

表示在 i 时刻他能移动的方向,字符串只包含UDLR四种字母。

Output

对于每组数据输出一行,表示P酱到达出口的最早时刻。如果他无法在 t 时刻内到达出口,输出-1

Sample input and output

Sample Input Sample Output
2
1 -1 5
LDRDR
-2 1 8
RRUDDLRU
3
-1

Hint

第一组样例:

  1. P酱在 0 时刻位于原点 (0,0) ,他只能向左移动,但他选择不走。
  2. P酱在 1 时刻依然位于原点 (0,0) ,他只能向下移动,于是他向下移动到了 (0,1)
  3. P酱在 2 时刻位于 (0,1) ,他只能向右移动,于是他移动到了出口 (1,1) ,所以在 3 时刻,P酱离开了这片区域!

My Solution

用数组的话,扫一次就够了;节约数组的话要扫好几次。我选择了用数组。觉得自己写的挺麻烦的。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int maxn=200000+8;
int cot[26][maxn];//为了找最后一个最短的最后一个动作

int main()
{
    int x,y,t,T,err=-1,ti;
    string str;
    scanf("%d",&T);
    while(T--){
        memset(cot,0,sizeof(cot));//不能用memset初始化除0以外的值... ... 如果想赋值0, 那么你可以用一个for loop... 至于为什么不能赋值#, 请参考百度知道http://baike.baidu.com/view/982208.htm
        scanf("%d%d%d",&x,&y,&t);
        cin>>str;
        int len=str.length();
        int l=0,r=0,u=0,d=0;
        for(int i=0;i<len;i++){   //第一个时间是1,所以要从1开始,但导致历遍的时候不好,所以加到下面去好了
            switch(str[i]){
            case 'L':
            {l++;cot['L'-'A'][l]=i+1;break;}//!注意每个地方都要用'X'-'A'转化过来
            case 'R':
            {r++;cot['R'-'A'][r]=i+1;break;}
            case 'U':
            {u++;cot['U'-'A'][u]=i+1;break;}
            case 'D':
            {d++;cot['D'-'A'][d]=i+1;break;}  //cot['d'-'a'][d]=i;
            default:
                break;
            }
        }
        if(x>=0&&y>=0){
            if(x<=r&&y<=u) { ti=max(cot['R'-'A'][x],cot['U'-'A'][y]);printf("%d\n",ti<=t? ti:err);}
            else printf("%d\n",err);
        }
        else if(x>=0&&y<=0){
            if(x<=r&&(-y)<=d) {ti=max(cot['R'-'A'][x],cot['D'-'A'][(-y)]);printf("%d\n",ti<=t? ti:err);}
            else printf("%d\n",err);
        }
        else if(x<=0&&y>=0){
            if((-x)<=l&&y<=u) {ti=max(cot['L'-'A'][(-x)],cot['U'-'A'][y]);printf("%d\n",ti<=t? ti:err);}
            else printf("%d\n",err);
        }  //等号全部放上去,不要紧的
        else{
            if((-x)<=l&&(-y)<=d) {ti=max(cot['L'-'A'][(-x)],cot['D'-'A'][-y]);printf("%d\n",ti<=t? ti:err);}
            else printf("%d\n",err);   //!前面没有AC是这里掉了个 else
        }
    }
    return 0;
}


谢谢



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值