广度搜索-1013

题意:有一个只有上下按钮的电梯,每一层有一个参数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;
 }

你可能感兴趣的:(C++,搜索,ACM)