这题乍一看是个搜索,但是仔细一想用最短路来做更简单啊,图论就是有意思,把每层楼可能到每层楼的路径保存为一个图
1 2 3 4 5
1 M M M 1 M
2 M M M M M
3 M 1 M 1 M
4 M 1 M M M
5 M M M M M
1表示可以到达存在路径,M表示不可达
然后在图中求最短路,一次AC,so easy ,注意范围。。93ms,还很快
//
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 10000000;
int N,A,B;
int G[201][201];
int dist[201];
int Ki[201];
void Dijkstra(int v0)
{
int vis[201];
int min;
int k;
for(int i = 1; i <= N; i++)
{
vis[i] = 0;
dist[i] = G[v0][i];
}
dist[v0] = 0;
vis[v0] = 1;
for(int v = 1; v <= N; v++)
{
min = MAX;
for(int w = 1; w <= N; w++)
{
if(!vis[w] && (dist[w] < min))
{
min = dist[w];
k = w;
}
}
vis[k] = 1;
for(int w = 1; w <= N; w++)
{
if(!vis[w] && (min + G[k][w] < dist[w]))
{
dist[w] = min + G[k][w];
}
}
}
}
int main()
{
while(cin>>N,N!=0)
{
cin>>A>>B;
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
{
G[i][j] = MAX;
}
}
for(int i = 1; i <= N; i++)
{
cin>>Ki[i];
if(i + Ki[i] <= N)
{
G[i][i+Ki[i]] = 1;
}
if(i - Ki[i] >= 1)
{
G[i][i-Ki[i]] = 1;
}
}
Dijkstra(A);
if(dist[B] < MAX)
cout<<dist[B]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}