您的位置:首页 > 其它

SDAU练习二1013

2016-04-18 21:56 190 查看
题目大意:

给出楼层总数,给出起始位置和终点位置。  然后现在 你在一个升降机里面,只能按 上升或者下降,给出  处在每层的时候  升降机运动的层数。也就是说,看样例:

现在处在  1  楼 ,要去  5楼。在  1 楼不可以按 下降,因为不可以降落到 -2 层。如果上升的话,会上升到  4  。也就是说上升或者下降越界的话,就不可以执行。

问 从起点到终点需要的最短次数。如果怎样都到不了没输出 -1

思路:

从起点 开始bfs ,只是上下两个状态。

感想:

注意  bfs 的套路!!小豆子说的好友道理,感觉受益匪浅

AC代码:

#include<iostream>

#include<string.h>

#include<queue>

#include<stdio.h>

using namespace std;

int mapp[205];

int vis[205];

int n,st,endd;

struct lift

{

    int x;

    int num;

    friend bool operator < (lift a,lift b)

    {

        return a.num>b.num;

    }

};

int bfs()

{

    priority_queue<lift>que;

    lift star;

    star.x=st;

    star.num=0;

    que.push(star);

    lift now,now1;

    while(!que.empty())

    {

        now=que.top();

        que.pop();

        vis[now.x]=1;

       if(now.x==endd)

       {

           int t=now.num;

            return t;

       }

       now1=now;

            now.x=now.x+mapp[now.x];

            now.num++;

            if(now.x>0&&now.x<=n&&!vis[now.x])

                que.push(now);

            now1.num++;

            now1.x=now1.x-mapp[now1.x];

            if(now1.x>0&&now1.x<=n&&!vis[now1.x])

                que.push(now1);

    }

    return 0;

}

int main()

{

    int i,j;

    while(~scanf("%d",&n))

    {

        if(n==0) break;

        cin>>st>>endd;

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

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

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

        int work=0;

        if(st==endd)

        {

            cout<<0<<endl;

            continue;

        }

        work=bfs();

        if(work)

            cout<<work<<endl;

        else

            cout<<-1<<endl;

    }

    return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: