hdu 1548 简单的bfs

/*题目意思:有一个电梯,在第i层时,可以向上a[i]层,或向下a[i]层。

现在,给出你的初始位置,和终点位置问你最少操作几次可以到达,假设

无法到达输出“-1”。

 

思路:用bfs从起点开始存入队列开始搜,假设下一个点没有走过而且在

      1~n层之间,则压入队列。符合条件则输出步数。

 

代码:*/

#include<iostream>

#include<stdio.h>

#include<queue>

#include<algorithm>

using namespace std;

int n,s,d,a[10085],vis[1005];//vis[]标记是否走过

struct ww

{

    int num;

    int step;

}p1,p2;//用结构体记住位置和步数

int bfs()

{

    memset(vis,0,sizeof(vis));

    queue<ww>q;

    p1.num =s;

    p1.step =0;

    q.push(p1);

    vis[p1.num]=1;//起点压入队列

    while(!q.empty())

    {

       

        p2=q.front ();

        q.pop();

        if(p2.num==d)//出口

            return p2.step ;

              //向上时

        if(p2.num+a[p2.num]<=n&&!vis[p2.num+a[p2.num]])

        {

                     //满足条件则步数加1,更新位置,压入队列,并标记

            p1.step=p2.step+1;

            p1.num =p2.num+a[p2.num];

                q.push(p1);

            vis[p2.num+a[p2.num]]=1;

        }

              //向下时

        if(p2.num-a[p2.num]>=1&&!vis[p2.num-a[p2.num]])

        {

            p1.step=p2.step+1;

            p1.num =p2.num-a[p2.num];

                q.push(p1);

            vis[p2.num-a[p2.num]]=1;

        }

 

    }

    return -1;//假设队列已空还没找到满足条件,则说明无法达到终点

}

int main ()

{

    int i,j;

    while(~scanf("%d%d%d",&n,&s,&d))//c++输入78毫秒,scanf只要0秒

   {

              if(n==0)

                     break;

       for(i=1;i<=n;i++)

       {

           scanf("%d",&a[i]);

       }

       int t=bfs();

       cout<<t<<endl;

 

    }

    return 0;

}

 

 

 
posted @ 2013-08-22 10:40  蜗牛的路 没有尽头  阅读(267)  评论(0编辑  收藏  举报