[Luogu P1588]丢失的牛

本文探讨了在坐标范围内使用BFS算法解决搜索问题的方法,通过对搜索过程进行优化,包括剪枝操作,避免了内存溢出和超时问题,实现了高效求解。文章详细介绍了如何在10^5的数据范围内,利用BFS算法找到两点间最短路径的步骤。

本题抽象一下就是从一个点出发,然后经过坐标x2或+1或-1到另一个点。显然这就是一个搜索题,而且显然可以看出步数最多就是两个点坐标之差。但是数据范围105,直接暴搜肯定要么MLE要么TLE,肯定不行,一定要加上优化。

我们注意到坐标的范围是(0,105],那么如果一个点扩展到了这个范围之外显然就不可能得到解了,因此直接剪枝。同时我们用bfs搜索,显然第一次搜到某个点那一定是到这个点的最少步数,之后再到达这个点就没必要再搜一遍了,有些记忆化的思想。

所以最后一顿剪枝操作就可以通过本题了,模拟的时候就因为剪枝条件少了一个导致MLEqwq。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int d[100010];
bool check(int x)
{
    return x > 0 && x < 100000 && !d[x];
}
int s,t;
struct qwq
{
    int x,step;
}top;
void bfs()
{
    queue<qwq>q;
    q.push((qwq){s,1});
    d[s] = 1;
    while(q.size())
    {
        top = q.front();
        q.pop();
        if(top.x == t) return;
        if(check(top.x + 1)) 
        {
            q.push((qwq){top.x + 1,top.step + 1});
            d[top.x + 1] = top.step + 1;
        }
        if(check(top.x - 1)) 
        {
            q.push((qwq){top.x - 1,top.step + 1});
            d[top.x - 1] = top.step + 1;
        }
        if(check(top.x << 1)) 
        {
            q.push((qwq){top.x << 1,top.step + 1});
            d[top.x << 1] = top.step + 1;
        }
    }
}
int main()
{
    int tt;
    scanf("%d",&tt);
    while(tt--)
    {
        scanf("%d%d",&s,&t);
        memset(d,0,sizeof(d));
        bfs();
        printf("%d\n",d[t] - 1);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/lijilai-oi/p/10987874.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值