题解 P2689 【东南西北】

· · 题解

这道题主要先判断从起点到终点的方向,再有技巧的运用一下map就可以过了。下附代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
map<char,int>fx; //定义方向 
int main()
{
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
    int x,y,x1,y1;
    scanf("%d%d",&x,&y);
    scanf("%d%d",&x1,&y1);
    if(x1>x)fx['E']=1,fx['W']=0;//如果终点横坐标比起点大,那么风向E是正方向,W不动 
    if(y1>y)fx['N']=1,fx['S']=0;//如果终点纵坐标比起点大,那么风向N是正方向,S不动 
    if(x1<x)fx['E']=0,fx['W']=-1;//反之 
    if(y1<y)fx['N']=0,fx['S']=-1;//反之 
    int t;
    scanf("%d",&t);
    int sum=0;
    for(int i=1;i<=t;i++)
    {
        char c;
        cin>>c;//读入风向 
        if((c=='E'||c=='W')&&x!=x1)
        {
        x+=fx[c];
        if(fx[c]!=0)sum++;//如果移动累加次数 
}//如果是东西方向移动,直接处理
        if((c=='N'||c=='S')&&y!=y1)
        {

        y+=fx[c];

        if(fx[c]!=0)sum++;//如果移动累加次数 

}//如果是南北方向移动,直接处理
    }
    if(x==x1&&y==y1)cout<<sum;
    else cout<<-1;//输出结果 
    return 0;
}