思路:本质上还是BFS,对于每一个访问过的点做一下标记,避免几个特殊的楼层互相跳。另外最先到达目标点的一定是时间最少的点(因为每次入队的点只比前面一个点所用的时间加1)
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 205;
int vis[maxn],a[maxn],u,v,n;
struct P{
int id;
long long t;
};
long long bfs(void){
queue<P> que;
P p,q;
p.id = u;
p.t = 0;
vis[p.id] = 1;
que.push(p);
while(que.size()){
p = que.front();
que.pop();
while(p.id == v){
return p.t;
}
q.id = p.id + a[p.id];
if(q.id<=n && q.id > 0 && !vis[q.id]){
q.t = p.t + 1;
vis[q.id] = 1;
que.push(q);
}
q.id = p.id - a[p.id];
if(q.id<=n && q.id > 0 && !vis[q.id]){
q.t = p.t + 1;
vis[q.id] = 1;
que.push(q);
}
}
return -1;
}
int main(){
while(scanf("%d",&n) != EOF && n){
scanf("%d%d",&u,&v);
memset(vis,0,sizeof(vis));
int i;
for(i=1 ;i<=n ;i++){
scanf("%d",&a[i]);
}
printf("%lld\n",bfs());
}
return 0;
}