1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   | 
  #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> using namespace std; #define MAXN 220 #define INF 0x3f3f3f3f
  int n, m; int dis[MAXN]; int vis[MAXN]; int mp[MAXN][MAXN]; int A, B;
  void dijkstra(int A) {     memset(vis, 0, sizeof(vis));     memset(dis, INF, sizeof(dis));     dis[A] = 0;     for(int i = 1; i <= n; i++){         int MinNumber, Min = INF;         for(int j = 1; j <= n; j++) if(!vis[j] && dis[j] < Min){             Min = dis[j];             MinNumber = j;         }         vis[MinNumber] = 1;         for(int j = 1; j <= n; j++){             dis[j] = min(dis[j], dis[MinNumber] + mp[MinNumber][j]);         }     } }
  int main() {     int k;     while(scanf("%d", &n) &&n){         scanf("%d %d", &A, &B);         memset(mp, INF, sizeof(mp));         for(int i = 1; i <= n; i++){             scanf("%d", &k);             if(i - k >= 1)                 mp[i][i - k] = 1;             if(i + k <= n)                 mp[i][i + k] = 1;         }         dijkstra(A);         if(dis[B] != INF)             printf("%d\n", dis[B]);         else             printf("-1\n");     }
      return 0; }
 
  |