一个电梯,每一层可以上行或下行不同的层数,问从一层到另一层需要按几次按键
原题:http://acm.hdu.edu.cn/showproblem.php?pid=1548
ac:
#include<cstdio>
#include<cstring>
const int N=210, INF=0x3f3f3f3f; //无穷大只能定义成这个。。。。。999999之类的不行
int d[N], w[N][N],vis[N],n,m,k[210];
void Dijkstra(int s)
{
memset(d,INF,sizeof(d));
d[s] = 0;
memset(vis, 0, sizeof(vis));
for(int i=1; i<=n; ++i)
{
int u=-1;
for(int j=1; j<=n; ++j)if(!vis[j])
{
if(u==-1 || d[j]<d[u]) u=j;
}
vis[u] = 1;
for(int v=1;v<=n;v++)
{
if(vis[v]==0&&d[u]+w[u][v]<d[v])
{
d[v]=d[u]+w[u][v];
}
}
}
}
int main()
{
int s,e;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d %d",&s,&e);
memset(w,INF,sizeof(w));
for(int i=1;i<=n;i++)
{
scanf("%d",&k[i]);
if(i+k[i]<=n) //不大于n
w[i][i+k[i]]=1; //设能到达的层之间权值为1
if(i-k[i]>=1)
w[i][i-k[i]]=1; //同上
}
Dijkstra(s);
if(d[e]==INF)
printf("-1\n");
else
printf("%d\n",d[e]);
}
return 0;
}