orzchy

洛谷P2689 东南西北

https://www.luogu.org/problemnew/show/P2689

#include<iostream>
#include<algorithm>
using namespace std;
int sx,sy,ex,ey,t,ans=1e9;//sx和sy为小明所在位置,ex和ey为小明想去的位置,ans为步数 
char a[101];//风向 
void dfs(int step,int x,int y,int i){//深搜函数,step为当前步数,x和y为当前坐标,i是a数组下标 
    if(x==ex&&y==ey){//判断当前坐标是否为小明想去的位置 
        ans=min(ans,step);//ans变为当前步数和ans的较小值 
        return;//返回 
    }
    if(i>t) return; 
    if(step>ans) return;//剪枝,如果当前步数大于当前最优解,就没有必要接着往下搜,返回上一步 
    if(a[i]=='E'&&x<ex) dfs(step+1,x+1,y,i+1);//判断当前x坐标是否在终点的x坐标的左边,如果是就往东(右)走,如果不是就不执行,不然可能会越走越远 
    if(a[i]=='W'&&x>ex) dfs(step+1,x-1,y,i+1);
    if(a[i]=='S'&&y>ey) dfs(step+1,x,y-1,i+1);
    if(a[i]=='N'&&y<ey) dfs(step+1,x,y+1,i+1);
    dfs(step,x,y,i+1);//留在原地,记住步数不能加一,我被这个坑了一次... 
}
int main(){
    cin>>sx>>sy>>ex>>ey>>t;//输入 
    for(int i=1;i<=t;i++){
        cin>>a[i];//输入风向 
    }
    dfs(0,sx,sy,1);//从起始坐标开始搜索,步数从0开始 
    if(ans==1e9) cout<<-1;//如果ans依然等于初始值,则说明无法到达,输出-1 
    else cout<<ans;//输出最少步数 
    return 0;
}

 凑这么多字不容易啊...

posted on 2019-03-16 10:49  orzchy  阅读(242)  评论(0编辑  收藏  举报

导航