【洛谷】P2689 東南西北(dfs|貪心)

P2689 東南西北

題目描述

給出起點和終點的座標及接下來T個時刻的風向(東南西北),每次能夠選擇順風偏移1個單位或者停在原地。求到達終點的最少時間。ios

若是沒法偏移至終點,輸出「-1」。spa

輸入輸出格式

輸入格式:code

 

第一行兩個正整數x1,y1,表示小明所在位置。blog

第二行兩個正整數x2,y2,表示小明想去的位置。ci

第三行一個整數T,表示T個時刻。string

第四至第N+3行,每行一個字符,表示風向,即東南西北的英文單詞的首字母。it

 

輸出格式:io

 

最少走多少步。ast

 

輸入輸出樣例

輸入樣例#1:  複製
1 1
2 2
5
E
N
W
W
N
輸出樣例#1:  複製
2
輸入樣例#2:  複製
1 1
2 2
1
W
輸出樣例#2:  複製
-1
輸入樣例#3:  複製
1 1
2 2
3
W
W
W
輸出樣例#3:  複製
-1

說明

樣例1:向東走一步,向南走一步。class

樣例二、3:沒法到達。

1<=T<=50

東:East

南:South

西:West

北:North

【題解】【首先要搞清楚一點,這裏所說的風向是吹向哪一個方向的風而不是咱們一般意義上的東西南北風,即N表明當前能夠順風向北走一個單位。還有一點要注意的是這裏的座標的增減是按照平面直角座標系的原則的,即向北縱座標增大,向東橫座標增大】

【dfs每一時刻都有順風行走和不動兩種狀態,而後 dfs下一時刻的行走可能。邊界:到達目的地或提供的時刻所有用完

 

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 char s[55];
 8 int s0,t0,s1,t1,n,num;
 9 void dfs(int x,int y,int f,int t){
10     if(x==s1&&y==t1)  {num=min(t,num); return;}
11     if(f>n) return;
12     if(s[f]=='E') dfs(x+1,y,f+1,t+1);
13     if(s[f]=='W') dfs(x-1,y,f+1,t+1);
14     if(s[f]=='S') dfs(x,y-1,f+1,t+1);
15     if(s[f]=='N') dfs(x,y+1,f+1,t+1);
16     dfs(x,y,f+1,t);
17     return;
18 }
19 int main(){
20     int i;
21     scanf("%d%d%d%d%d\n",&s0,&t0,&s1,&t1,&n);
22     for(i=1;i<=n;++i) scanf("%c\n",&s[i]);
23     num=1000000000;
24     dfs(s0,t0,1,0);
25     if(num==1000000000) printf("-1\n");
26      else printf("%d\n",num);
27     return 0;
28 }

 

 

 

 

【貪心,咱們知道,從一個點到另外一個點的圖上最短路就是兩點的橫座標差+縱座標差,與路線無關,所以只需判斷所給的全部風向是否能知足橫座標和縱座標的變動需求便可】

 

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char c;
int x0,y0,x1,y1,t,n,e,w,s,ans,p;
int main(){
    int a,b,i;
    scanf("%d%d%d%d%d",&x0,&y0,&x1,&y1,&t);
    for(i=1;i<=t;++i)
     {
         cin>>c;
         if(c=='E') e++;
         if(c=='N') n++;
         if(c=='S') s++;
         if(c=='W') w++;
     }
    a=x1-x0; b=y1-y0; 
    if(a>0)
     if(a<=e) p++;
    if(a<0) 
     {
         a=-a;
         if(a<=w) p++;
     }
    if(a==0) p++;
    if(p)
     {
         if(b>0)
          if(b<=n) p++;
         if(b<0)
          {
              b=-b;
              if(b<=s) p++;
          }
        if(b==0) p++;
     }
    if(p==2) printf("%d",a+b);
     else printf("-1");
    return 0;
} 
相關文章
相關標籤/搜索