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; }