CodeForces - 298B Sail (思维题)

CodeForces - 298B Sail
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.

  • 题目大意:
    每一个时间有一个风向,E S N W中的一个 分别是向东 ,向南,向北,向西。在每一个时间点你可以选择停在原点不动,也可以顺着风向前进一个单位。问能否在规定时间内从起点到终点,能得话输出最小的时间,不能的话,输出-1。
  • 解题思路:
    设 起点 (sx,sy),终点(ex,ey)
    x=ex-sx>0 说明需要往东走,y=ey-sy>0 说明需要向北走。然后只要从头扫一遍风向,看什么时候E的个数>=x 并且N得个数>=y 。然后依次考虑其他的三个方向即可。
  • AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int t,sx,sy,ex,ey;
const int maxn=1e5+10;
int S,E,W,N;
int s,e,w,n;
char a[maxn];
int main()
{
	cin>>t>>sx>>sy>>ex>>ey;
	E=ex-sx;
	W=sx-ex;
	N=ey-sy;
	S=sy-ey;
	for(int i=0;i<t;i++)
	{
		cin>>a[i];
		if(a[i]=='E')
			e++;
		if(a[i]=='W')
			w++;
		if(a[i]=='S')
			s++;
		if(a[i]=='N')
			n++;
	}
	if(S>s||W>w||N>n||E>e)
		cout<<"-1"<<endl;
	else
	{
		int time=0;
		int t1=0,t2=0;
		if(E>=W&&N>=S)
		{
			for(int i=0;i<t;i++)
			{
				if(a[i]=='E')
					t1++;
				if(a[i]=='N')
					t2++;
				time++;
				if(t1>=E&&t2>=N)
					break;
			}
		}
		else if(W>=E&&N>=S)
		{
			for(int i=0;i<t;i++)
			{
				if(a[i]=='W')
					t1++;
				if(a[i]=='N')
					t2++;
				time++;
				if(t1>=W&&t2>=N)
					break;
			}
		}
		else if(W>=E&&S>=N)
		{
			for(int i=0;i<t;i++)
			{
				if(a[i]=='W')
					t1++;
				if(a[i]=='S')
					t2++;
				time++;
				if(t1>=W&&t2>=S)
					break;
			}
		}
		else if(E>=W&&S>=N)
		{
			for(int i=0;i<t;i++)
			{
				if(a[i]=='E')
					t1++;
				if(a[i]=='S')
					t2++;
				time++;
				if(t1>=E&&t2>=S)
					break;
			}
		}
		cout<<time<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43179892/article/details/84543722