题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目描述:
有一个电梯,上面只有UP 和DOWN 两种按钮,每层楼梯有一个值,按下UP按钮就会上升这么多层,按下DOWN按钮就会下降这么多层。问对于给定的从A层到B层,至少需要按几次按钮?
解题思路:
还是基础的Dijkstra求最短路,注意判断边界条件,每条路径的花费都是1。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 999999
using namespace std;
int N,A,B;
int cost[220][220],dis[220],vis[220];
void reset()
{
memset(cost,0,sizeof(cost));
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
int i,j;
for(i=0;i<220;i++)
for(j=0;j<220;j++)
cost[i][j]=MAX;
for(i=0;i<220;i++)
dis[i]=MAX;
}
bool ok(int x)
{
if(x>=1&&x<=N)
return 1;
return 0;
}
void dijkstra(int st)
{
vis[st]=1;
dis[st]=0;
int i;
while(1)
{
for(i=1;i<=N;i++)
{
dis[i]=min(dis[i],dis[st]+cost[st][i]);
}
int mindis=MAX;
for(i=1;i<=N;i++)
{
if(dis[i]<mindis&&!vis[i])
{
mindis=dis[i];
st=i;
}
}
if(mindis==MAX)break;
vis[st]=1;
}
}
int main()
{
int i,j,len;
while(cin>>N,N)
{
reset();
cin>>A>>B;
for(i=1;i<=N;i++)
{
cin>>len;
if(ok(i-len))cost[i][i-len]=1;
if(ok(i+len))cost[i][i+len]=1;
}
dijkstra(A);
if(dis[B]==MAX)
cout<<-1<<endl;
else
cout<<dis[B]<<endl;
}
return 0;
}
AC截图: