洛谷 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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号