codeforce-298B Sail(模拟)

B. Sail

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

The polar bears are going fishing. They plan to sail from (sx, sy) to (ex, ey). However, the boat can only sail by wind. At each second, the wind blows in one of these directions: east, south, west or north. Assume the boat is currently at (x, y).

  • If the wind blows to the east, the boat will move to (x + 1, y).
  • If the wind blows to the south, the boat will move to (x, y - 1).
  • If the wind blows to the west, the boat will move to (x - 1, y).
  • If the wind blows to the north, the boat will move to (x, y + 1).

Alternatively, they can hold the boat by the anchor. In this case, the boat stays at (x, y). Given the wind direction for t seconds, what is the earliest time they sail to (ex, ey)?

Input

The first line contains five integers t, sx, sy, ex, ey (1 ≤ t ≤ 105,  - 109 ≤ sx, sy, ex, ey ≤ 109). The starting location and the ending location will be different.

The second line contains t characters, the i-th character is the wind blowing direction at the i-th second. It will be one of the four possibilities: "E" (east), "S" (south), "W" (west) and "N" (north).

Output

If they can reach (ex, ey) within t seconds, print the earliest time they can achieve it. Otherwise, print "-1" (without quotes).

Examples

input

5 0 0 1 1
SESNW

output

4

input

10 5 3 3 6
NENSWESNEE

output

-1

Note

In the first sample, they can stay at seconds 1, 3, and move at seconds 2, 4.

In the second sample, they cannot sail to the destination.

题目大意:

北极熊要去钓鱼了。他们计划从(sx,sy)航行到(ex,ey)。然而,这艘船只能靠风航行。每过一秒,风都会向东、南、西或北的方向吹。假设船当前位于(x,y)。

如果风吹向东方,船将移动到(x+y,)。
如果风向南吹,船将移动到(x,y-1)。
如果风向向西,船将移动到(x-1,y)。
如果风吹向北方,船将移动到(x,y+1)。
或者,他们可以用锚把船固定住。在这种情况下,船保持在(x,y)。考虑到T秒的风向,他们最早的航行时间是什么时候(例如,ey)?

输入
第一行包含五个整数t,sx,sy,ex,ey(1≤≤105,-109≤sx,sy,ex,ey≤109)。开始位置和结束位置将不同。

第二行包含T字符,第i个字符是第i秒的风向。这将是四种可能性之一:“E”(东)、“S”(南)、“W”(西)和“N”(北)。

输出
如果他们能在T秒内达到(例如,ey),则打印他们能达到的最早时间。否则,打印“-1”(不带引号)。

分析:只要判断每次操作后是否与之前的距离缩短即可,能够缩短就前进一步,否则下锚(即不进行任何操作),每次操作完后检查是否。如果到终点了结束,输出步数即可。当所有的操作都遍历完后,如果还没有到达终点输出-1结束即可。

#include<stdio.h>
#include<string.h>
int abs(int a)
{
	return a>=0?a:-a;
}
const int M=1e5+5;
int t,sx,sy,ex,ey,i=0,tw=0,ans=1;
char a[M];
int main()
{
	scanf("%d %d %d %d %d",&t,&sx,&sy,&ex,&ey);//输入起点终点坐标
	scanf("%s",a);//输入操作步骤
	int x=sx;int y=sy;
	int tempx,tempy;
	while(1)
	{
		tempx=x;
		tempy=y;
		if(i==t)//判断所有操作步骤是否完成
		{
			ans=0;//如果完成后还没有到达终点,标记结束
			break;
		}
		switch(a[i])//如果还没有遍历完所有步骤
		{           //则判断本次步骤的方向,并从该方向前进一步
			case 'N':
			{
				tempy+=1;
				break;
			}
			case 'S':
			{
				tempy-=1;
				break;
			}
			case 'E':
			{
				tempx+=1;
				break;
			}
			case 'W':
			{
				tempx-=1;
				break;
			}
		}
		if(abs(ex-x)>abs(ex-tempx)||abs(ey-y)>abs(ey-tempy))
		{   //如果前进后的距离小于先前距离,则变为正式向这个方向前进一步
			x=tempx;
			y=tempy;
			i++;
			tw++;
		}
		else//否则忽略本次操作
                {
			i++;tw++;
		}
		if(x==ex&&y==ey)//操作完后,判断是否到达终点,如果到达,输出步数结束
		{
			break;
		}
	}
	if(ans==0)//判断结果,并输出对应结果
		printf("-1\n");
	else
	    printf("%d\n",tw);
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值