最基本的一道最短路,用搜索也可以轻松A掉。
此题的关键在于构图,就是将电梯的上下转化为此层可到的两个点。。。为有向图,原理相同。。
附上代码:
#include<stdio.h>
#include<string.h>
int map[202][202];
int vis[202];
int divs[202];
int n;
void dij(int a)
{
for(int i=0; i<n; i++)
divs[i]=map[a][i];
divs[a]=0;
vis[a]=1;
for(int i=1; i<n; i++)
{
int min=0x7ffffff;
int t=-1;
for(int j=0; j<n; j++)
if(!vis[j]&&divs[j]<min)
min=divs[j],t=j;
if(t==-1)
return ;
vis[t]=1;
for(int j=0; j<n; j++)
if(!vis[j]&&divs[j]>map[t][j]+divs[t])
divs[j]=map[t][j]+divs[t];
}
}
int main()
{
int a,b;
while(scanf("%d",&n),n)
{
scanf("%d%d",&a,&b);
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
map[i][j]=0x7ffffff;
for(int i=0; i<n; i++)
{
int z;
scanf("%d",&z);
if(i+z<n)
map[i][i+z]=1;
if(i-z>=0)
map[i][i-z]=1;
}
dij(a-1);
if(divs[b-1]==0x7ffffff)
printf("-1\n");
else
printf("%d\n",divs[b-1]);
}
return 0;
}