返回顶部

洛谷 P1135 奇怪的电梯 (DFS)

  • 题意:有一\(n\)层高的大楼,每层楼都只能在合法情况下上\(x\)层或者下\(x\)层,问你是否能从\(a\)层楼坐电梯到\(b\)层楼,输出最小步数.

  • 题解:直接dfs搜,\(flo\)表示层数,\(cnt\)表示步数,如果\(flo=b\),维护最小值,然后对这层楼标记已走过,判断是否合法再向上向下搜,然后回溯取消标记.

  • 代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    
    int n,a,b;
    int v[N];
    int ans=INF;
    bool st[N];
    
    void dfs(int flo,int cnt){
    	if(flo==b) ans=min(ans,cnt);
    	if(cnt>ans) return;
    	st[flo]=true;
    	if(flo+v[flo]<=n && !st[flo+v[flo]]) dfs(flo+v[flo],cnt+1);
    	if(flo-v[flo]>=1 && !st[flo-v[flo]]) dfs(flo-v[flo],cnt+1);
    	st[flo]=false;
    }
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
    	cin>>n>>a>>b;
    	 for(int i=1;i<=n;++i) cin>>v[i];
    	 
    	 dfs(a,0);
    	 
    	 if(ans==INF) cout<<-1<<endl;
    	 else cout<<ans<<endl;
    	 
        return 0;
    }
    
posted @ 2020-06-16 09:53  _Kolibri  阅读(233)  评论(0)    收藏  举报