給出起點和終點的座標及接下來T個時刻的風向(東南西北),每次能夠選擇順風偏移1個單位或者停在原地。求到達終點的最少時間。ios
若是沒法偏移至終點,輸出「-1」。spa
輸入格式:code
第一行兩個正整數x1,y1,表示小明所在位置。blog
第二行兩個正整數x2,y2,表示小明想去的位置。ci
第三行一個整數T,表示T個時刻。string
第四至第N+3行,每行一個字符,表示風向,即東南西北的英文單詞的首字母。it
輸出格式:io
最少走多少步。ast
樣例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; }