[BFS] [洛谷] P1135 奇怪的电梯

一看求最短步数

嗯 简单BFS

主题构建非常容易

但是有段时间没写了 

MLE 一发

马上反应过来没判重 出现来回走两个点的情况

可以证明:

走过的点不用管以后会不会走到

因为以后再走肯定没有现在走优

所以走过的点直接标记

以后就不走了

#include <iostream>
#include <queue>
using namespace std;

const int MAXN = 2e2 + 10;

bool isfind = false;

typedef long long ll;

ll arr[MAXN] = {0};

ll brr[MAXN] = {0};

ll N, A, B;

struct floor
{
    ll now;
    ll step;
}beg;

queue <floor> q;

void bfs(floor beg)
{
    floor ret;

    ret = beg;

    q.push(ret);

    while(!q.empty())
    {
        ret = q.front();

        q.pop();

        if(ret.now == B)
        {
            cout<<ret.step<<endl;

            isfind = true;

            return ;
        }

        else
        {
            floor tmp;

            tmp = ret;
            if(brr[tmp.now] == 0)
            {
                brr[tmp.now] = 1;

                if(tmp.now + arr[tmp.now] <= N)
                {
                    tmp.now += arr[tmp.now];
                    tmp.step ++;

                    q.push(tmp);
                }

                tmp = ret;

                if(tmp.now - arr[tmp.now] >= 1)
                {
                    tmp.now -= arr[tmp.now];
                    tmp.step++;

                    q.push(tmp);
                }    
            }
            
        }

    }
}

int main()
{
    cin>>N>>A>>B;

    for(int i = 1; i <= N; i++)
    {
        cin>>arr[i];
    }

    beg.now = A;

    beg.step = 0;

    bfs(beg);

    if(!isfind)
    {
        cout<<-1<<endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Zeolim/article/details/81358145