P1135 奇怪的电梯(dfs、bfs)

https://www.luogu.com.cn/problem/P1144

#include<bits/stdc++.h>
using namespace std;
int n,m,A,B;
int flag=0,ans=0x3f3f3f,vis[205];
int a[205];
void dfs(int k,int step){
    if(vis[k]||step>ans)return;

    if(k<0||k>n)return;
    if(k==B){
        flag=1;
        ans=min(ans,step);
        return ;
    }
    vis[k]=1;
    dfs(k+a[k],step+1);
    dfs(k-a[k],step+1);
    vis[k]=0;
}
int main()
{
    cin>>n>>A>>B;
    fill(vis,vis+205,0);
    for(int i=1;i<=n;i++)cin>>a[i];
    dfs(A,0);
    if(!flag)cout<<"-1"<<endl;
    else cout<<ans<<endl;
}

bfs版本

#include<bits/stdc++.h>
using namespace std;
int n,m,A,B;
int flag=0,ans=0x3f3f3f,vis[205];
int a[205];
queue<pair<int,int> >q;
int bfs(){
    while(!q.empty()){
        pair<int,int> k=q.front();
        vis[k.first]=1;
        q.pop();
        if(k.first==B){
            flag=1;
            return k.second;
        }
        if(!(vis[k.first+a[k.first]])&&k.first+a[k.first]<=n)q.push(make_pair(k.first+a[k.first],k.second+1));
        if(!(vis[k.first-a[k.first]])&&k.first-a[k.first]>=1)q.push(make_pair(k.first-a[k.first],k.second+1));
    }
}
int main()
{
    cin>>n>>A>>B;
    fill(vis,vis+205,0);
    for(int i=1;i<=n;i++)cin>>a[i];
    q.push(make_pair(A,0));
    int ans=bfs();
    if(!flag)cout<<"-1"<<endl;
    else cout<<ans<<endl;
}

 

posted @ 2020-05-20 20:19  mohari  阅读(123)  评论(0编辑  收藏  举报