题意:有一个只有上下按钮的电梯,每一层有一个参数m,在这一层只能向上或向下走m层,问从A层到达B层最少需要走几步。
思路:采用BFS广搜来解决,因为行走路线可以形成一个二叉树,每一步都有两种选择:上或者下。因此,BFS的那种层层搜索恰好能让我们找到满足题目条件的最短路径,注意A == B的情况
#include <iostream>
#include <cstdio>#include <cstring>
#define M 205
#define MAX 0x3f3f3f3f
using namespace std;
int map[M][M],vis[M],dis[M];
int main()
{
int n,a,b,i,j,s;
while(~scanf("%d",&n)&&n)
{
scanf("%d%d",&a,&b);
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(i==j)
map[i][j]=0; //同一个地方距离为0
else
map[i][j]=MAX;
}
for(i=1; i<=n; i++)
{
scanf("%d",&s);
if(i+s<=n) //标记这一层电梯可以去的楼层
map[i][s+i]=1;
if(i-s>=1)
map[i][i-s]=1;
}
vis[a]=1; //起点已走过
for(i=1; i<=n; i++) dis[i]=map[a][i]; //初始化距离为每个点到起点的距离
int min,k,t;
for(i=1; i<=n; i++)
{
min=MAX;
for(j=1; j<=n; j++)
if(!vis[j]&&dis[j]<min) //每次都找离终点最近的点
{
min=dis[j];
t=j;
}
vis[t]=1; //标记为已经找过此点
for(j=1; j<=n; j++)
if(!vis[j]&&map[t][j]<MAX) //从最近的点到下一个点的距离与初始距离进行比较
if(dis[j]>dis[t]+map[t][j])
dis[j]=dis[t]+map[t][j];
}
if(dis[b]<MAX)
printf("%d\n",dis[b]);
else //不能到 则输出-1
printf("-1\n");
}
return 0;
}