UESTC758(贪心)

P酱的冒险旅途

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

P酱是个可爱的男孩子,有一天他在野外冒险,不知不觉中走入了一块神奇的地方。他在 0 0时刻进入这个地方,每一时刻他都只能向某一特定的方向移动长度为1的距离,当然他也可以选择不移动。移动需要花费 1 1的时间。

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

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

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

Input

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

接下来每组数据包含两行,第一行包含三个整数  x,y,t x,y,t ( 105x,y105,0<t105 −105≤x,y≤105,0<t≤105);第二行包含一个长度为 t t的字符串,第 i i个字符表示在 i i时刻他能移动的方向,字符串只包含UDLR四种字母。

Output

对于每组数据输出一行,表示P酱到达出口的最早时刻。如果他无法在 t 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,0) (0,0),他只能向左移动,但他选择不走。
  2. P酱在 1 1时刻依然位于原点 (0,0) (0,0),他只能向下移动,于是他向下移动到了 (0,1) (0,−1)
  3. P酱在 2 2时刻位于 (0,1) (0,−1),他只能向右移动,于是他移动到了出口 (1,1) (1,−1),所以在 3 3时刻,P酱离开了这片区域!

Source

第五届ACM趣味程序设计竞赛第二场(正式赛)

//UESTC758(贪心)
//题目大意:初始时人在坐标原点,给出目标位置,然后是一组指令 
//U-向上可以走一步.D-表示可以向下走一步.R-表示向右走一步.L-表示向左走一步.
//每时刻都可以选择走或不走,都耗费一个单位的时间,问能否在指令执行一遍后到达目标位置。若能输出最小用时.否则输出-1.
//解题思路:由于如果该组指令可以到达目标位置的话,要求最少用时。所以当某时刻的指令执行时如果会远离目标位置
//的话就停一个单位时间,(否则最终就可能不是最短用时)当是向目标位置靠近时就向该方向走一步。如此进行直到走到目标位置
//或指令执行完后仍为走到目标位置(此时打印-1). 
#include<cstdio>
#include<cstring>
#include<cmath>
struct node
{
	int x,y,t;
};
char str[100100];             //定义一个字符数组,存放一组指令 
int main()
{
    int len,ex,ey,flag,t;
    scanf("%d",&t);
    struct node p,s;
	while(t--)
	{
	  p.t=p.x=p.y=0;
	  s.x=s.y=0;
	  flag=0;    
	  memset(str,0,sizeof(str));                   //状态标志,初始时,表示未走到目标位置。 
	  scanf("%d%d%d",&ex,&ey,&len);
	  scanf("%s",str);
	  len=strlen(str);
	  for(int i=0;i<len;i++)
	  {
	  	if(p.x==ex&&p.y==ey) //走到目标位置,跳出循环 
	  	{
	  	  flag=1;break;	
		}
	    if(str[i]=='U'&&ey>0&&p.y<ey)  //当指令向上,且这样可以接近目标位置 
		{
			s.x=p.x;
			s.y=p.y+1;
		}
		else if(str[i]=='D'&&ey<0&&p.y>ey)  //同上 
		{
			s.x=p.x;
			s.y=p.y-1;	
		}	
		else if(str[i]=='R'&&ex>0&&p.x<ex)  //同上 
		{
			s.y=p.y;
			s.x=p.x+1;
		}
		else if(str[i]=='L'&&ex<0&&p.x>ex) //同上 
		{
			s.y=p.y;
			s.x=p.x-1;
		}
		else
		{
			s.x=p.x;
			s.y=p.y;
		} 
		s.t=p.t+1;
		p=s;
	  } 
	  if(flag==1)
	   printf("%d\n",p.t);
	  else
	   printf("-1\n");
	}	
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bokzmm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值